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

时间:2011-11-22 02:03:49

标签: 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;
        }
    }
}

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

new Enclosing<Integer>.Inner(5);

发生以下错误:

  

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

请务必注意,我无法创建内部类static,因为它包含T类型的字段。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:12)

To instantiate an inner class,您必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:

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

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

答案 1 :(得分:0)

刚遇到同样的问题,在java 7中以下列方式解决了它

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();
    }
}