【问题标题】:Generic inner class constructor accepts different type parameter what is set?通用内部类构造函数接受不同的类型参数设置什么?
【发布时间】: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?如果您使用&lt;Integer&gt; 而不是&lt;&gt;,也会发生这种情况吗?
  • 没有javac v1.8.0_121 的复制,我确实收到了错误。 Eclipse 只是编译它(如果我删除了方法调用)。
  • 对我来说它也没有意义,但你不应该用 T 参数化 Inner 类吗?
  • 顺便说一句,除了缺少有关编译器版本的信息之外,这是一个非常好的问题,一点也不令人费解。您包含的代码 sn-p 是完整的、可读的并产生所描述的错误,这一事实使其超过了此处提出的所有问题的 90%。 :)
  • 感谢大家的快速回复!我正在使用 eclipse,如果我错了,请纠正我,不使用标准的 javac 编译器?所以这就是为什么这个错误只能在 Eclipse 中重现?

标签: java class generics constructor nested


【解决方案1】:

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

这似乎是 Eclipse 编译器中的一个错误,特别是在处理菱形运算符时。如果您将该行替换为InnerGeneric&lt;Integer&gt; inner2 = new InnerGeneric&lt;Integer&gt;(1);,那么 Eclipse 也会拒绝它。

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

【讨论】:

  • 哇,我可能发现了一个错误,真是令人兴奋!我该如何报告它?也许有更好经验的人应该,因为我对 java 还是很陌生
  • 你可以做到here,过程应该相当简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2021-11-05
  • 2022-12-11
相关资源
最近更新 更多