为复杂的问题道歉,但我无法找到一种更容易的问题。我目前正在试验仿制药,并遇到了一些我无法解决的问题。我有一个类型参数为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)
对我来说有意义。为什么构造函数方法不会发生这种情况?
以下是我的代码片段:
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的版本意味着什么,因为我还是比较新的
答案 0 :(得分:3)
我尝试使用javac 1.8.0_25并且它给出了编译错误,正如您正确期望的那样,而Eclipse确实没有。 (我假设您从错误消息中引用它是您正在使用的Eclipse。)
这似乎是Eclipse编译器中的一个错误,特别是对于菱形运算符的处理。如果用InnerGeneric<Integer> inner2 = new InnerGeneric<Integer>(1);
替换该行,那么Eclipse也会拒绝它。
(虽然我的搜索技能不是很好,据我所知,它还没有被记录为Eclipse的bug,所以你应该报告它。)