Создание экземпляров открытых внутренних классов универсальных классов - PullRequest
6 голосов
/ 22 ноября 2011

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

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.

Как я могу обойти это?

Ответы [ 2 ]

12 голосов
/ 22 ноября 2011

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

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

Уродливый синтаксис предполагает запах кода в этом дизайне.Вероятно, должен быть какой-то фабричный метод в классе Enclosing (getInner или что-то в этом роде), и внутренний класс, вероятно, должен реализовывать открытый интерфейс, если он используется извне своего класса включения.

0 голосов
/ 27 января 2013

просто столкнулся с той же проблемой, решил ее следующим образом в 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...