通用内部类构造函数接受设置的不同类型参数?

时间:2017-05-24 10:26:20

标签: java class generics constructor nested

为复杂的问题道歉,但我无法找到一种更容易的问题。我目前正在试验仿制药,并遇到了一些我无法解决的问题。我有一个类型参数为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的版本意味着什么,因为我还是比较新的

1 个答案:

答案 0 :(得分:3)

我尝试使用javac 1.8.0_25并且它给出了编译错误,正如您正确期望的那样,而Eclipse确实没有。 (我假设您从错误消息中引用它是您正在使用的Eclipse。)

这似乎是Eclipse编译器中的一个错误,特别是对于菱形运算符的处理。如果用InnerGeneric<Integer> inner2 = new InnerGeneric<Integer>(1);替换该行,那么Eclipse也会拒绝它。

(虽然我的搜索技能不是很好,据我所知,它还没有被记录为Eclipse的bug,所以你应该报告它。)