Reputation: 16456
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 typeEnclosing<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?
Upvotes: 7
Views: 5278
Reputation: 1727
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();
}
}
Upvotes: 0
Reputation: 262534
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.
Upvotes: 14