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

7

我有这样一个东西:

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.Inner;请使用其简单名称和类型为 Enclosing 的封装实例。
需要注意的是,因为内部类包含类型为 T 的字段,所以我不能将其设置为静态。
如何解决这个问题呢?

1
回复:“需要注意的是,我无法将内部类设置为static,因为它包含一个类型为T的字段”:这更像是一个理由来使内部类成为泛型,使用与外部类相同的边界,而不是使内部类非静态。(并不是说你的内部类应该是静态的。这取决于你的整体设计,而不是这个细节。) - ruakh
2个回答

14

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

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

这个设计中的丑陋语法表明存在代码异味。在封装类中应该有一个工厂方法(例如getInner),内部类如果被其封装类外部使用,则可能需要实现一个公共接口。

1
设计确实很糟糕,幸好这不是生产代码。 - knpwrs

0

刚遇到了同样的问题,在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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接