有很多与 Java 泛型相关的线程,我无法弄清楚为什么 Java 不支持它(或者,我需要做什么才能使其工作)。
public interface Thinger<T> {
Class<? extends Thinger<T>> getThingers();
}
public class Thingy<Qwerty> implements Thinger<String> {
@Override
public Class<? extends Thinger<String>> getThingers() {
return Thingx.class;
}
}
public class Thingx implements Thinger<String> {
@Override
public Class<? extends Thinger<String>> getThingers() {
return Thingy.class; // Incompatible types error
}
}
我可以通过两种方式修复编译错误,但这两种方式最终都会丢失我想要保留的某种类型的输入信息!
选项 1
删除通用的Qwerty
在Thingy<Qwerty>
.
public class Thingy implements Thinger<String> {
..
// Ends up fixing the compile error in Thingx
选项 2
删除通用的String
在Class<? extends Thinger<String>>
public class Thingx implements Thinger<String> {
@Override
public Class<? extends Thinger> getThingers() {
return Thingy.class; // Fixed!
Thingy.class
返回 Class<Thingy>
哪里Thingy
是原始类型,因为它没有指定 Qwerty
的值。因为它是原始类型,所以编译器只知道 Thingy
实现Thinger
,而不是 Thinger<String>
,因为该信息由于类型删除而丢失。
要修复此问题,您可以将 Class<Thingy>
转换为到 Class<? extends Thinger>
使用 Class#asSubclass
,然后编译器允许隐式转换为 Thinger<String>
.
return Thingy.class.asSubclass(Thinger.class);
测试时不会产生编译器或运行时错误:
Class<? extends Thinger<String>> c = new Thingx().getThingers();
System.out.println(c.getGenericInterfaces()[0]);
输出是:
Thinger<java.lang.String>
我是一名优秀的程序员,十分优秀!