Създаване на екземпляри на публични вътрешни класове на генерични класове

Така че имам нещо като следното:

public class Enclosing<T extends Comparable<T>> {
    // non-relevant code snipped
    public class Inner {
        private T value;
        public Inner(T t) {
            value = t;
        }
    }
}

Всичко се компилира и светът е щастлив. Въпреки това, когато се опитам да създам екземпляр на Enclosing.Inner както следва, не мога:

new Enclosing<Integer>.Inner(5);

Възниква следната грешка:

Не може да се разпредели тип член Enclosing<Integer>.Inner с помощта на параметризирано съставно име; използвайте простото му име и обхващащ екземпляр от тип Enclosing<Integer>.

Важно е да се отбележи, че не мога да направя вътрешния клас static, защото съдържа поле от тип T.

Как мога да заобиколя това?


person knpwrs    schedule 22.11.2011    source източник
comment
Re: Важно е да се отбележи, че не мога да направя вътрешния клас static, защото той съдържа поле от тип T: Това звучи по-скоро като причина да направя вътрешния клас общ, използвайки същите граници като външния клас, отколкото като причина да направите вътрешния клас нестатичен. (Въпреки това, че вашият вътрешен клас трябва да е статичен. Това зависи от вашия дизайн като цяло, а не от този детайл.)   -  person ruakh    schedule 22.11.2011


Отговори (2)


За да създадете екземпляр на вътрешен клас, първо трябва да създадете екземпляр на външния клас. След това създайте вътрешния обект във външния обект с този синтаксис:

  Enclosing<Integer> outerObject = new Enclosing<Integer>();
  Enclosing<Integer>.Inner innerObject = outerObject.new Inner();

Грозният синтаксис предполага миризма на код в този дизайн. Вероятно трябва да има фабричен метод от някакъв вид в Enclosing класа (getInner или нещо подобно) и вътрешният клас вероятно трябва да имплементира публичен интерфейс, ако се използва извън своя обхващащ клас.

person Thilo    schedule 22.11.2011
comment
Дизайнът наистина мирише и за щастие това не е производствен код. - person knpwrs; 22.11.2011

просто се натъкнах на същия проблем, реших го по следния начин в java7

public class Test {
    static class A<T> {
        public class B {

        }
    }
    A<String> a = new A();
    class C extends A.B {
        C() {
            Test.this.a.super();
        }
    }
    public void test() {
        C c = new C();
        A.B b = this.a.new B();
    }
}
person aepurniet    schedule 27.01.2013