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?
To instantiate an inner class, you must first instantiate the outer class. Then, create the inner object within the outer object with this syntax: OuterClass outerObject = new OuterClass(); OuterClass. InnerClass innerObject = outerObject.
Java inner class can be declared private, public, protected, or with default access whereas an outer class can have only public or default access.
Method-local Inner Class In Java, we can write a class within a method and this will be a local type. Like local variables, the scope of the inner class is restricted within the method. A method-local inner class can be instantiated only within the method where the inner class is defined.
A Generic Version of the Box Class To update the Box class to use generics, you create a generic type declaration by changing the code "public class Box" to "public class Box<T>". This introduces the type variable, T, that can be used anywhere inside the class.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With