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

Java 创建泛型类的公共内部类的实例,java,generics,instantiation,inner-classes,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; } } } 发生以下错误: 无法使用参数化的复合名称分配封闭

因此,我有如下几点:

public class Enclosing<T extends Comparable<T>> {
    // non-relevant code snipped
    public class Inner {
        private T value;
        public Inner(T t) {
            value = t;
        }
    }
}
发生以下错误:

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

需要注意的是,我不能使内部类
成为静态的
,因为它包含类型为
T
的字段

如何解决这个问题?

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

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

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

刚刚遇到同样的问题,在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();
    }
}
公共类测试{
静态A类{
公共B级{
}
}
A=新的A();
C类扩展了A.B{
C(){
Test.this.a.super();
}
}
公开无效测试(){
C=新的C();
A.B=这个新的B();
}
}

Re:“需要注意的是,我不能将内部类
设置为静态的
,因为它包含类型为
T
”的字段:这听起来更像是将内部类设置为泛型的原因,使用与外部类相同的边界,而不是将内部类设置为非静态的原因。(当然,并不是说你的内部类应该是静态的。这取决于你的整体设计,而不是这一个细节。)设计确实很糟糕,谢天谢地,这不是生产代码。
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();
    }
}