Java泛型的个人小结
1)泛型参数只能是类类型
例如:List<int> // 报错
List<Integer> // 正确
例如:List<int> // 报错
List<Integer> // 正确
2)泛型的类型参数可以有多个!
例如:List<Integer,String,Boolean> list = new
例如:List<Integer,String,Boolean> list = new
ArrayList<Integer,String,Boolean>();
3)泛型的参数类型可以使用extends,习惯称“有界类型”,
例如:List<student extends person>,person为list的上界
3)泛型的参数类型可以使用extends,习惯称“有界类型”,
例如:List<student extends person>,person为list的上界
4)泛型可以使用通配符类型!“?” 相当于“Object”类型,(注意不可逆)
例如:List<?> //定义成这样可以添加Object类型到List里面去
List<Object>; //定义成这样不可以添加String类型到List里面去
List<? extends Object>; // 这样就可以互等了!这样还可以设定泛型的上限
例如:List<?> //定义成这样可以添加Object类型到List里面去
List<Object>; //定义成这样不可以添加String类型到List里面去
List<? extends Object>; // 这样就可以互等了!这样还可以设定泛型的上限
5)带泛型的类,构造方法写法不变,其后不可以加泛型!
例如:class Student<T>{
public Student<T>(){} // 构造方法这样写就错了
}
例如:class Student<T>{
public Student<T>(){} // 构造方法这样写就错了
}
6)List<String> 不是 List<Object> 的子类!,不可以把前者看成后者的子类,所以不
可以把前者的实例赋给后者
例如: List<String> Slist = new ArrayList<String>();
Slist.add(new String("abc"));
List<Object> Olist = new ArrayList<Object>();
Olist.add("abc");
Olist = Slist; // 报错!
例如: List<String> Slist = new ArrayList<String>();
Slist.add(new String("abc"));
List<Object> Olist = new ArrayList<Object>();
Olist.add("abc");
Olist = Slist; // 报错!
7)带不同泛型参数的实例可以共享类的静态方法和静态变量,所以静态方法和静态变量
申明的时候不可以使用类型行参
例如:class Cup<T>{
static T info; // 报错!
public static setInfo(T info){}; // 报错!
}
例如:class Cup<T>{
static T info; // 报错!
public static setInfo(T info){}; // 报错!
}
8)带不同泛型参数的类是共享一个字节码文件的!反编译过后泛型参数就被擦除了
例如:List<String> Slist = new ArrayList();
Slist.add(new String("aaa"));
List<Integer> Ilist = new ArrayList();
Ilist.add(new Integer(100));
System.out.println(Slist.getClass()==Ilist.getClass());
结果为true;
例如:List<String> Slist = new ArrayList();
Slist.add(new String("aaa"));
List<Integer> Ilist = new ArrayList();
Ilist.add(new Integer(100));
System.out.println(Slist.getClass()==Ilist.getClass());
结果为true;
9)当使用定义了泛型参数的接口 和 父类的时候!就不能在带参数了
例如:class Sub extends Father<String> {} // 错误
例如:class Sub extends Father<String> {} // 错误
10)
class T<E>{}
public class typeTest extends T<E>{}//报错
class T<E>{}
public class typeTest extends T<E>{}//报错
class T<E>{}
public class typeTest extends T<Integer>{} // 正确 可使用String等基本封装类型
public class typeTest extends T<Integer>{} // 正确 可使用String等基本封装类型
class T<E>{}
class Student{}
public class typeTest extends T<Student>{} // 这样也正确
class Student{}
public class typeTest extends T<Student>{} // 这样也正确
11) 泛型方法 ,泛型方法的参数的作用域仅在本方法,要和方法带泛型区分开!
Static <T> void test(List<String> S_list){} // 泛型参数要放在返回类型前
Static <T> void test(List<String> S_list){} // 泛型参数要放在返回类型前
12)带有泛型的代码转换成没有泛型的代码由javac完成,虚拟机不处理这些事情!
这种技术叫做 “擦除”;
例如:class Food<T extends Number>{
T size;
public Food(T size){} //注意构造方法不可以带泛型参数!
public void setSize(){ this.size = size; }
public T getSize(){ return this.size;}
}
public class test{
public static void main(String arg[]){
Food<Integer> a = new Food<Integer>(6);
Ingeger as = a.getSize(); // 返回的是Integer的类型
Food b = a; //把a对象赋给Food变量;泛型参数类型会丢失 即擦除;
Number size1 = b.getSize(); // b只知道size的类型是Number
// Integer in = b.getSize(); 这样是编译错误的!
}
}
这种技术叫做 “擦除”;
例如:class Food<T extends Number>{
T size;
public Food(T size){} //注意构造方法不可以带泛型参数!
public void setSize(){ this.size = size; }
public T getSize(){ return this.size;}
}
public class test{
public static void main(String arg[]){
Food<Integer> a = new Food<Integer>(6);
Ingeger as = a.getSize(); // 返回的是Integer的类型
Food b = a; //把a对象赋给Food变量;泛型参数类型会丢失 即擦除;
Number size1 = b.getSize(); // b只知道size的类型是Number
// Integer in = b.getSize(); 这样是编译错误的!
}
}
相关推荐
泛型为Java编程带来了类型安全和代码重用的优势,通过参数化类型的概念,允许开发者编写更通用、更健壮的代码。它减少了类型转换错误,并通过编译时的类型检查避免了运行时的异常。泛型的引入使Java集合框架的使用...
Java 泛型编程是Java语言在JDK 1.5版本引入的一项重要特性,它极大地提高了代码的安全性和可重用性。泛型本质上是参数化类型,允许我们在编写代码时,将数据类型作为参数,这使得类、接口和方法能够处理多种不同的...
Java 泛型是Java编程语言中的一个重要特性,它在2004年随着Java SE 5.0的发布被引入。泛型的主要目的是提供类型安全,同时减少在编译时和运行时出现的类型转换错误。它允许程序员在定义类、接口和方法时指定参数类型...
泛型化是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。实例190 - 泛型化的折半查找法,就是关于如何利用泛型优化传统折半查找算法的一个实践示例。折半...
接着,我们简化了Apla多重赋值语句到Java编程语言的自动转换方法,实现了抽象数据类型语言机制。 为了提高软件的可靠性和生产效率,我们还引入了三种安全泛型语言机制:类型安全机制、行为安全机制和抽象数据类型...
Java泛型是Java编程语言中的一种特性,它允许在数据结构(如集合)中存储特定类型的元素,从而提供了编译时的类型安全性和更清晰的代码。泛型引入的主要目标是消除强制类型转换的需要,减少类型转换带来的潜在错误,...
在Java编程语言中,泛型和反射是两个非常重要的特性,它们在软件开发中有着广泛的应用。本篇文章将深入探讨这两个概念以及它们在实际开发中的小运用。 首先,我们来看泛型(Generics)。泛型是在Java SE 5.0引入的...
在Java编程语言中,泛型(Generic)是一个强大的特性,它允许我们在编译时检查类型安全,并且可以消除运行时的类型转换。黑马程序员提供的这篇关于泛型的学习注意点,结合了源码分析和工具应用,旨在帮助开发者深入...
通过以上知识点,我们可以看到Java泛型在编程中的重要性和灵活性。理解和掌握这些概念对于编写高效、安全的Java代码至关重要。在实际开发中,熟练运用泛型可以显著提高代码质量,减少潜在的错误,并提高代码的可维护...
Java编程是计算机科学领域中最广泛使用的编程语言之一,尤其在企业级应用开发中占据主导地位。这个主题"Java编程21-50例"显然涵盖了从第21个到第50个Java编程实例,旨在帮助学习者通过实践加深对Java语言的理解。...
Java泛型是Java编程语言的一个重要特性,允许在编译时期提供类型安全,确保不同类型的对象在集合中独立存在,避免了类型转换错误。泛型的主要目的是减少类型转换,提供编译期类型检查以及消除类型安全警告。Java泛型...
Java编程是计算机科学领域中最广泛使用的编程语言之一,尤其在企业级应用开发中占据着核心地位。本资源“java编程1-50例”显然是一份涵盖了基础到进阶的Java编程实例集,旨在帮助学习者通过实际操作来掌握Java语言的...
### Java编程语言中的泛型详解 #### 一、引言 随着JDK 1.5的发布,Java编程语言引入了一系列重要扩展,其中最显著的特点之一便是泛型(Generics)。本文将详细介绍Java中的泛型概念及其应用。无论您是否熟悉其他...
在Java编程语言中,泛型(Generics)是自Java 5版本引入的一项重要特性,它允许我们在类、接口和方法中使用类型参数,从而提高了代码的可复用性和安全性。"实例188 - 泛型化接口与最大值"这个主题探讨了如何在接口...
Java泛型是Java编程语言中的一个重要特性,它在2004年随着Java SE 5.0的发布而引入。这个特性允许程序员在定义类、接口和方法时声明类型参数,从而增强了代码的类型安全性和重用性。通过使用泛型,我们可以编写更加...
Java泛型是Java编程语言的一个强大特性,它允许在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率和安全性。 ### Java泛型概述 Java泛型是在JDK 5中引入的一种新特性,用于创建参数...
泛型方法是Java编程语言中的一个重要特性,它允许在方法定义时指定类型参数,从而提高了代码的重用性和安全性。这种技术在数据查询场景中尤为关键,因为它可以确保操作的数据类型一致,避免了运行时可能发生的...
泛型是Java编程语言中的一个重要特性,它引入于JDK 5.0,极大地提高了代码的类型安全性和可读性。泛型允许我们在类、接口和方法中使用类型参数,这样我们可以在编译时检查类型,避免了运行时类型转换的麻烦和潜在的...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编写类、接口和方法时指定参数化类型,使得代码在编译时期就能捕获类型错误,...