Создание экземпляров общедоступных внутренних классов универсальных классов

Итак, у меня есть что-то вроде следующего:

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