创建泛型类的公共内部类的实例

knp*_*wrs 6 java generics instantiation inner-classes

所以我有以下内容:

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

一切都在汇编,世界也在快乐.但是,每当我尝试创建Enclosing.Inner如下的实例时,我都不能:

new Enclosing<Integer>.Inner(5);
Run Code Online (Sandbox Code Playgroud)

发生以下错误:

无法Enclosing<Integer>.Inner使用参数化复合名称分配成员类型; 使用它的简单名称和封闭的类型实例Enclosing<Integer>.

重要的是要注意我不能创建内部类static,因为它包含一个类型的字段T.

我该如何解决这个问题?

Thi*_*ilo 12

要实例化内部类,必须首先实例化外部类.然后,使用以下语法在外部对象中创建内部对象:

  Enclosing<Integer> outerObject = new Enclosing<Integer>();
  Enclosing<Integer>.Inner innerObject = outerObject.new Inner();
Run Code Online (Sandbox Code Playgroud)

丑陋的语法暗示了这种设计中的代码味道.在Enclosing类(getInner或其他东西)中应该有某种工厂方法,如果从封闭类之外使用它,内部类可能应该实现一个公共接口.