【问题标题】:Creating instances of public inner classes of generic classes创建泛型类的公共内部类的实例
【发布时间】:2012-01-03 11:59:17
【问题描述】:

所以我有如下内容:

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&lt;Integer&gt;.Inner;使用它的简单名称和 Enclosing&lt;Integer&gt; 类型的封闭实例。

需要注意的是,我无法创建内部类static,因为它包含T 类型的字段。

我该如何解决这个问题?

【问题讨论】:

  • Re:“重要的是要注意,我不能创建内部类static,因为它包含T 类型的字段”:这听起来更像是创建内部类的原因通用的,使用与外部类相同的边界,而不是使内部类成为非静态的原因。 (并不是说你的内部类应该是静态的。这取决于你的整体设计,而不是这个细节。)

标签: java generics instantiation inner-classes


【解决方案1】:

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

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

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

【讨论】:

  • 设计确实很臭,幸好这不是生产代码。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多