public static void main(String[] args) {
List stringList = new ArrayList<>();
stringList.add("string");
List integerList = new ArrayList<>();
integerList.add(1);
System.out.println(stringList.getClass() == integerList.getClass());
}
public static void main(String[] args) {
/**不指定泛型的时候*/
int i = Test.add(1, 2); //这两个参数都是Integer,所以T为Integer类型
Number f = Test.add(1, 1.2); //这两个参数一个是Integer,一个是Float,所以取同一父类的最小级,为Number
Object o = Test.add(1, "asd"); //这两个参数一个是Integer,一个是Float,所以取同一父类的最小级,为Object
/**指定泛型的时候*/
int a = Test.add(1, 2); //指定了Integer,所以只能为Integer类型或者其子类
int b = Test.add(1, 2.2); //编译错误,指定了Integer,不能为Float
Number c = Test.add(1, 2.2); //指定为Number,所以可以为Integer和Float
}
//这是一个简单的泛型方法
public static T add(T x,T y){
return y;
}
3. 类型擦除带来的问题和解决方法
3.1 和多态的冲突
有这样一个泛型类
class Pair {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
一个子类继承它
class DateSon extends Pair {
@Override
public void setValue(Date value) {
super.setValue(value);
}
@Override
public Date getValue() {
return super.getValue();
}
}
在子类中,我们设定泛型类型为Date,那么父类的两个方法参数类型都是Date
public Date getValue() {
return value;
}
public void setValue(Date value) {
this.value = value;
}
我们从代码编译来看,@Override重写父类方法,没有任何问题。
但是,类型擦除后,父类的泛型类型都变为了Object,编译后为
class Pair {
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
子类的重写方法
@Override
public void setValue(Date value) {
super.setValue(value);
}
@Override
public Date getValue() {
return super.getValue();
}
参数类型不一样,参数名一样… 根据Java语言特性,这应该是重载,而不是重写啊
写一个方法测试一下
public static void main(String[] args) {
DateSon dateSon = new DateSon();
dateSon.setValue(new Date());
dateSon.setValue(new Object()); // 编译报错
}