同一泛型类,如果实例化时,给定的实际类型不同,则这些实例的类型是不兼容的,不能相互赋值
Generic<Boolean> f1=new Generic<Boolean>();
Generic<Integer> f2=new Generic<Integer>();
//编译错误,f1和f2类型不兼容
f1=f2;
//编译错误,f1和f类型不兼容
Generic<Object> f=f1;
泛型类实例之间的不兼容性,会带来使用的不便。我们可以使用泛型通配符(?),声明泛型类的变量就可以解决这个问题。
泛型通配的方式:
- “?”代表任意一个类型
Generic<Boolean> f1=new Generic<Boolean>();
Generic<?> f=f1; //编译通过
- ?extends superClass/interface限定通配符匹配类型的上限
Generic<Dog> f1=new Generic<Dog>();
Generic<? extends Animal> f=f1; //编译通过
- ? super subClass限定通配符匹配类型的下限
Generic<Dog> f1=new Generic<Dog>();
Generic<Animal> f2=new Generic<Animal>();
Generic<? super Dog> f=f1;//编译通过
Generic<? super Dog> k=f2;//编译通过
Code Demo:
package Genericity;
public class GenericDemo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
GenericClass<Dog> dogClass=new GenericClass<Dog>();
Dog objDog=new Dog();
dogClass.setObj(objDog);
dogClass.getObj().eat();
GenericClass<Cat> catClass=new GenericClass<Cat>();
catClass.setObj(new Cat());
catClass.getObj().eat();
GenericClass<Animal> anmClass=new GenericClass<Animal>();
GenericClass<String> strClass=new GenericClass<String>();
//“?”代表任意一个类型
GenericClass<?> gClass=null;
gDogClass=dogClass;
gCatClass=catClass;
//gCatClass.getObj得到的对象是object类型,需要对其作强制类型转换
((Cat)gCatClass.getObj).eat();
// ?extends superClass限定通配符匹配类型的上限
GenericClass<? extends Dog> sClass=null;
sClass=dogClass;
sClass.getObj().eat();
/*sClass=anmClass; //类型超过通配上限*/
// ? super subClass限定通配符匹配类型的下限
GenericClass<? super Animal> mClass=null;
/*mClass=dogClass; //类型超过通配下限 */
mClass=anmClass;
}
}
class GenericClass<T>{
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
abstract class Animal{
public abstract void eat();
}
class Dog extends Animal{
public void eat(){
System.out.println("eating bones");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("eating fish");
}
}