[英]issue with inner class of generic type
下面的代码无法编译最后一行,即使第二个最后一行编译好,而差异只是在似乎在其范围内的泛型类型。
谁有人解释一下? 我想这与擦除有关,但为什么倒数第二个语句编译好?
public class Main {
public static class A {
public class Inner {
}
}
public static class B extends A {
public class Inner {
}
}
public static class Wrap<T extends A> {
public Class<T.Inner> get(Class<T.Inner> cls) {
return cls;
}
}
public static void main(String... args) {
Wrap<A> wa = new Wrap<>();
Wrap<B> wb = new Wrap<>();
// this compiles OK
Class<A.Inner> ai = wa.get(A.Inner.class);
// this fails
Class<B.Inner> bi = wb.get(B.Inner.class);
}
}
编译器错误:
/tmp$ javac -Xdiags:verbose Main.java
Main.java:24: error: method get in class Wrap<T> cannot be applied to given types;
Class<B.Inner> bi = wb.get(B.Inner.class);
^
required: Class<Main.B.Inner>
found: Class<Main.B.Inner>
reason: argument mismatch; Class<Main.B.Inner> cannot be converted to Class<Main.B.Inner>
where T is a type-variable:
T extends Main.A declared in class Wrap
1 error
我无法解释java的required / found语句,但是当定义T
为T extends A
则T.Inner
变为A.Inner
。
有多种可能的变化使它工作:
B
删除Inner
Inner
B
定义为extends A.Inner
并将get方法更改为public <C extends T.Inner> Class<C> get(Class<C> cls)
(使用Eclipse编译器工作,使用JDK的javac不起作用) B
Inner
定义为extends A.Inner
并将get方法更改为public <C extends A.Inner> Class<C> get(Class<C> cls)
应该如何更改取决于您希望使用此类构造实现的目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.