所以我有以下内容:
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
类型的字段。
我该如何解决这个问题?
答案 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();
}
}