【发布时间】:2017-05-24 10:26:19
【问题描述】:
为这个令人费解的问题道歉,但我想不出一个更简单的方法来问这个问题。我目前正在尝试使用泛型,但遇到了一些我无法理解的问题。我有一个带有类型参数T 的泛型类,它有一个带有类型参数E 的泛型内部类。但是,内部类的构造函数需要T。
如果我用Outer<String> 实例化外部类并用<Integer> 实例化内部类,并使用整数调用其构造函数,则没有问题。这对我来说没有任何意义,因为在这种情况下,构造函数只能与 String 一起使用,正如在 Outer 类型参数中设置的那样。为什么会这样?
如果我在内部类中创建一个需要T 的方法,那么The method method(T) in the type Outer<T>.InnerGeneric<Integer> is not applicable for the arguments (int) 对我来说确实有意义。构造函数方法怎么不会出现这种情况?
这是我的代码的 sn-p:
public class Outer<T> {
class InnerGeneric<E> {
InnerGeneric(T t) {
//do something
}
void method(T t) {
//do something
}
}
class Inner {
}
Outer(T t) {
InnerGeneric<T> inner1 = new InnerGeneric<>(t);
InnerGeneric<Integer> inner2 = new InnerGeneric<>(1); //i do not get any error here,
and the code can run just
fine with this, why???
inner2.method(t);
inner2.method(1); //get a compilation error here, this makes sense to me
}
public static void main(String[] args) {
Outer<String> outer = new Outer<>("Any string");
}
}
编辑:我正在使用 Eclipse,不确定这对于 javac 的版本意味着什么,因为我对这一切还很陌生
【问题讨论】:
-
您使用的是哪个版本的 javac?如果您使用
<Integer>而不是<>,也会发生这种情况吗? -
没有
javacv1.8.0_121的复制,我确实收到了错误。 Eclipse 只是编译它(如果我删除了方法调用)。 -
对我来说它也没有意义,但你不应该用 T 参数化 Inner 类吗?
-
顺便说一句,除了缺少有关编译器版本的信息之外,这是一个非常好的问题,一点也不令人费解。您包含的代码 sn-p 是完整的、可读的并产生所描述的错误,这一事实使其超过了此处提出的所有问题的 90%。 :)
-
感谢大家的快速回复!我正在使用 eclipse,如果我错了,请纠正我,不使用标准的 javac 编译器?所以这就是为什么这个错误只能在 Eclipse 中重现?
标签: java class generics constructor nested