public class Demo {
public static void main(String[] args) {
Test<Dog> t1 = new Test<>(); //在这里我已经将t1中的a指定为Dog类型
//执行fun1修改其中的a类型为Cat类型,这里Dog和Cat没有继承关系不应该发生类型转换异常吗?
t1.fun1(t1); //正常运行,没有报任何错误。
System.out.println(t1.a); //输出为Cat
}
}
@SuppressWarnings("all")
class Test<E> {
E a;
<T extends Test> void fun1(T t) {
t.a = new Cat();
}
}
class Dog { }
class Cat { }
泛型在编译后都是用Object替代,所以你传啥都不会报错。
但是如果你Dog里有一个run
方法,Cat里有一个walk
方法,你的func1
方法里如果想要用Dog的run
或者Cat的walk
,就需要先使用instance of
判断a的实际类型了。
可以,编译器已经根据你的 Test t1 推断出后面的对象的类型了!