Конструктор получает экземпляр внутреннего универсального класса в качестве параметра.Как это использовать? - PullRequest
0 голосов
/ 25 мая 2018

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

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Как объясняет @GhostCat, вы никогда не сможете создать нестатическое внутреннее без предоставления экземпляра внешнего.И область видимости T видна внутреннему классу, вам не нужно определять другой тип U. Я бы написал это так:

    public class Solve {
       public static void main(String[] args){
            C<String> c = new C<>();
            c.c1 = c.new C1();
            c.c1.value = "Inner Generic Class";
            System.out.println(c.c1.value);
       }
    }


    class C<T> {   

       public C1 c1;

       class C1 {
            public T value;
       }
    }
0 голосов
/ 25 мая 2018

Вы уже прибили его.

Если у вас есть внутренний класс, который не статичен, тогда вам всегда нужен экземплярвнешний, включающий класс для создания объекта внутреннего класса (см., например, здесь ).

В этом смысле у вас есть проблема курицы / яйца, которая просто не может бытьрешена.Вам нужен экземпляр внутреннего класса для создания внешнего объекта, но сначала вам понадобится этот внешний объект для создания внутреннего объекта.

И даже если для этого потребуется какой-нибудь грязный хак, это будетскорее всего, будет грязный взломать.Просто не делай этого.Таким образом, реальный ответ здесь состоит в том, чтобы сделать шаг назад и ближе рассмотреть проблему, которую вы на самом деле хотите решить, используя этот дизайн.Чтобы потом найти решение, которое не сломано по замыслу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...