gpt4 book ai didi

java - 构造函数获取内部泛型类的实例作为其参数。如何使用它?

转载 作者:行者123 更新时间:2023-11-30 06:09:44 29 4
gpt4 key购买 nike

假设如下class (没有任何错误,甚至警告):

class C<T> {
C(C1<T> c1) { /*...*/ }

class C1<U> { /*...*/ }
}

现在,我如何创建它的新实例?

new C<String>(new C1<String>()) {};  // Error behind `<String>`: Type arguments given on a raw type 
// + Warning behind `new C1<String>()`: Unchecked assignment: 'com.example.package.C.C1<java.lang.String>' to 'com.example.package.C<java.lang.String>.C1<java.lang.String>'type

new C<String>(new C1<>()) {}; // Error behind `<>`: Type arguments given on a raw type

new C<String>(new C1()) {}; // Warning behind `new C1()`: Unchecked assignment: 'com.example.package.C.C1' to 'com.example.package.C<java.lang.String>.C1<java.lang.String>'

虽然第三种方式不包含错误,但这不是我想要的! 我想要 new C1<String> 。此外,它还包含一个警告。

<小时/>

请注意,仅当 C1 时才会出现问题。是一个内在class (不是 static ) of C 。例如下面的代码就没有问题:

class C<T> {
C(C2<T> c1) { /*...*/ }

//class C1<U> { /*...*/ }
}

class C2<V> { /*...*/ }

...

new C<String>(new C2<String>()) {};  // OK
new C<String>(new C2<>()) {}; // OK (and is equivalent)

最佳答案

你已经成功了。

当您有一个静态的内部类时,您总是需要外部封闭类的实例才能创建内部类对象(例如,请参见 here)。

从这个意义上说,这是一个先有鸡还是先有蛋的问题,根本无法解决。您需要内部类的实例来创建外部对象,但您首先需要该外部对象来创建内部对象。

即使有一些肮脏的黑客可以解决这个问题,那也很可能是一个肮脏的黑客。只是不要这样做。因此,这里真正的答案是退后一步,仔细看看您实际上想要使用此设计解决的问题。然后找到一个不被设计破坏的解决方案。

关于java - 构造函数获取内部泛型类的实例作为其参数。如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536022/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com