class A{}
class B extends A{}
class GenericMethods {
public <T> T f1(T x) {
System.out.println(x.getClass().getName());
return x;
}
}
public class testP {
public static void main(String[] args) {
GenericMethods gm = new GenericMethods();
A a = gm.f1(new B());
//B b = gm.f1(new A());编译报错
}
}
f1 方法是一个泛型方法,返回值是< >
里的T
,形参也是< >
里的T
。所以二者推断出来的具体类型必须一样,或者符合多态。
执行A a = gm.f1(new B())
时,返回值处的T
被推断为A
,形参处的T
本来会被推断为B
,但是由于前者,形参处的T
这里被推断为A
。这里传B
对象作为实参符合多态,泛型和多态不冲突。
还有就是 B b = gm.f1(new A());编译通不过怎么解释比较好,可以认为这句是推断为B
返回的也是B
只是这里不允许向下转型吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.