泛型:
泛型是java jdk1.5出现的新特性之一。
泛型是给编译看的,当传入的实参类型不符时,会在编译期报错。而反射可以绕过编译器。
ArrayList
整个ArrayList
ArrayList
整个ArrayList
ArrayList
ArrayList
ArrayList称为原始类型
参数化类型与原始类型的兼容性:
如下面的两个都是可以的,但是编译时会出现一个警告。
Collection
Collection c = new Vctor
参数化类型不考虑类型参数的继承关系:
Collection
泛型中的通配符: ?
在使用通配符泛型类型作为一个方法的参数列表时,此方法体中就不能再使用和类型有关的方法。只能使用与参数类型不管的方法,否侧的话会报错。
如下:
public static void printCollection(Collection> collection){
//collection.add(1); (错的,不可以。因为1使用了指定的类型)
collection.size(); //可以
for(Object obj : collection){
System.out.println(obj);
} //可以
collection = new HashSet
}(较有效)
但是此时可以使用“通配符的方法”来克服这个弊端:
如下:
public static void printCollection(Collection
collection.add(obj); //这时,是可以的
collection.size(); //可以
for(Object obj : collection){
System.out.println(obj);
} //可以
collection = new HashSet
}
通配符的扩展
限制通配符的上边界:
正确: Vector extends Number> x = new Vector
错误: Vector extends Number> x = new Vector
限制通配符的下边界:
正确: Vector super Integer> x = new Vector
错误: Vector super Integer> x = new Vector
Float x1 = add(3.5,3); ( 错 )。
此时的编译器提示信息“Type nismatch: cannot convert from Number&Comparable> to Float”。
所以需要实现Comparble的Number,所以只能是Number类。所以只能改成下边这样。
Number x1 = add(3.5,3);
但是问题出现了,你会发现Number类并没有实现Comparable接口,而是只实现了Serializable接口。不知道这个是怎么解释的呢?
类型推断具有传播性,通过下边的例子就可以看出来了:
copy1(new Vector
copy2(new Date[10],new String[10]); //都取他们的交集类,即Object类
copy1(new Vector
public static
for(int x=0; x
}
---------------------- android培训、java培训、期待与您交流! ----------------------
}
public static
for(T t : dest){
t = src;
}
}
自定义泛型类(类级别的泛型):
其目的就是当我的类中有多个方法用到的泛型都是同一个类型,
而我们有想让这两个类型相同,就可以给这个类定义上这个泛型。这也是泛型类的由来。
注意静态方法中不能使用泛型。
class Person
{
public static void update(E obj){}
} (报错)
这是需要把他独立出来,单独使用“方法级别的泛型”
class Person
{
public static
} (对)
对于泛型,java在编译之后就会去类型化。下边的两个方法不是重载。
public static void applyVector(Vector
}
public static void applyVector(Vector
}
通过反射获取泛型的实际类型参数:(高级)
其思路是这样的,我们无法通过一个变量的数据是无法知道自己是什么类型的。
只能通过把这个变量作为一个参数传递给方法,通过泛型方法来知道参数列表中的泛型类型的。
代码如下:
//Vector
Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class);
Type[] types = applyMethod.getGenericParameterTypes();
ParameterizedType pType = (ParameterizedType)types[0];
System.out.println(pType.getRawType());
System.out.println(pType.getActualTypeArguments()[0]);