Creating instances of public inner classes of generic classes

穿精又带淫゛_ 提交于 2019-12-10 13:30:49

问题


So I have something like the following:

public class Enclosing<T extends Comparable<T>> {
    // non-relevant code snipped
    public class Inner {
        private T value;
        public Inner(T t) {
            value = t;
        }
    }
}

Everything compiles and the world is happy. However, whenever I try to create an instance of Enclosing.Inner as follows, I can't:

new Enclosing<Integer>.Inner(5);

The following error happens:

Cannot allocate the member type Enclosing<Integer>.Inner using a parameterized compound name; use its simple name and an enclosing instance of type Enclosing<Integer>.

It is important to note that I cannot make the inner class static, because it contains a field of type T.

How can I work around this?


回答1:


To instantiate an inner class, you must first instantiate the outer class. Then, create the inner object within the outer object with this syntax:

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

The ugly syntax suggests a code smell in this design. There should probably be a factory method of some kind in the Enclosing class (getInner or something) and the inner class should probably implement a public interface if it is being used from outside its enclosing class.




回答2:


just ran into the same problem, solved it the following way in 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();
    }
}


来源:https://stackoverflow.com/questions/8221088/creating-instances-of-public-inner-classes-of-generic-classes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!