集合泛型:
List<String> list = new ArrayList<String>();
1\ 泛型只在编译阶段有效。为了减少类型转换异常。编译完的.class
文件中没有泛型
2\泛型避免了向下转型。对于迭代器来说, Iterator后面的泛型必须带,如果不带,就是Object类型。
3\泛型的类型参数只能是类类型,不能是简单类型。
4\泛型在创建对象时才具体
5、类或者接口的泛型只能用在非静态方法中,不能用于静态方法,对于静态方法,只能使用泛型方法的形式。
继承或实现类中:
泛型不具体,子类也需要带泛型
泛型具体,子类可以不带泛型
特点:
1.菱形技术 :1.7jdk开始的 ,可以通过类型推断 推断出后面的类型。
ArrayList<String> list=new Arraylist<>()
2.可擦除技术:
在class文件中并没有泛型的存在。
泛型类
格式:
//泛型类
class A<K,V>{
public void fun(K k,V v) {
System.out.println(k.equals(v));
}
}
泛型接口
interface I<K,V>{
public void fun(K k,V v);
}
实现接口方法一:泛型不具体,子类也需要带泛型
class ZiI<K, V> implements I<K,V>{
@Override
public void fun(K k, V v) {
// TODO Auto-generated method stub
}
/*public static void fun1(K k) {
* //Cannot make a static reference to the non-static type K
* 类或者接口的泛型只能用在非静态方法中,不能用于静态方法,对于静态方法,只能使用泛型方法的形式。
}*/
public static <T> void fun2(T t) {
System.out.println(t);
}
}
实现方法二: 泛型具体,子类可以不带泛型
class ZiI2 implements I<String,String>{
@Override
public void fun(String k, String v) {
// TODO Auto-generated method stub
}
}
泛型方法
泛型方法是在方法上声明了泛型,而不是使用了泛型的方法。
使用类或者接口的泛型这些方法不算泛型方法。
类或者接口的泛型只能用在非静态方法中,不能用于静态方法,对于静态方法,只能使用泛型方法的形式。
定义方式
class FanXingMethod{
public <K> void fun(String s,K k) {
}
}
泛型通配符
?
:任何数据类型
public void add(ArrayList<?> objList) {
}
? extends E
:只能是E类型或者E的子类
public void add(ArrayList<? extends E> eList) {
}
? super E
:只能是E类型或E的父类
public void add(ArrayList<? super E> eList) {
}