鉴于此代码示例:
class A {
}
public class TestGenerics {
private static <T extends A> T failsToCompile() {
return new A();
}
private static <T extends A> T compiles(T param) {
return param;
}
}
为什么第一个方法不能编译,但第二个方法可以?
错误是:
不兼容的类型。要求:T。发现:A
本质上,我想要实现的是返回子类型的具体实例(例如,扩展 A 的类 B)。有点像工厂方法。
Edit:好的,对于那些投反对票的人,我决定进一步详细说明。请参阅更新后的示例,它不再使用 String (是的,我知道 String 是最终的,无需声明明显的内容)
Edit 2:问题的替代版本:
您将如何实现此方法以便它可以编译(没有未经检查的强制转换和警告)?
abstract <T extends A> T failsToCompile();
Edit 3:这是一个更接近我要解决的问题的代码示例:
class Foo { }
class Bar extends Foo { }
class A<T extends Foo> { }
class B extends A<Bar> { }
public class TestGenerics {
private static <T extends Foo> A<T> failsToCompile() {
return new B();
}
}
这里,方法的返回类型是A<T>
。考虑到T
被定义为Foo 或其子类,B的定义如下:B extends A<Bar>
,为什么我不能直接返回new B()
?我想问题归结为你无法分配List<Animal> dList = new ArrayList<Dog>();
我明白为什么。但是有一个优雅的解决方案吗?
忽略这样一个事实String
is final
(所以你不能有一个子类String
),你可以传递泛型类Class<T>
进入一般情况的方法。喜欢,
private static <T extends String> T get(Class<T> cls)
throws InstantiationException, IllegalAccessException {
return cls.newInstance();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)