Предположим ниже 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
) 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)