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