I want to make a generic class of this form:
class MyGenericClass<T extends Number> {}
Problem is, I want to be acceptable for T to be either Integer or Long, but not Double. So the only two acceptable declarations will be:
MyGenericClass<Integer> instance; MyGenericClass<Long> instance;
Is there any way to do that?
The answer is no. At least there is no way to do it using generic types. I would recommend a combination of generics and factory methods to do what you want.
class MyGenericClass<T extends Number> { public static MyGenericClass<Long> newInstance(Long value) { return new MyGenericClass<Long>(value); } public static MyGenericClass<Integer> newInstance(Integer value) { return new MyGenericClass<Integer>(value); } // hide constructor so you have to use factory methods private MyGenericClass(T value) { // implement the constructor } // ... implement the class public void frob(T number) { // do something with T } }
This ensures that only MyGenericClass<Integer>
and MyGenericClass<Long>
instances can be created. Though you can still declare an variable of type MyGenericClass<Double>
it will just have to be null.
No, there's nothing in Java generics to allow this. You might want to consider having a non-generic interface, implemented by FooIntegerImpl
and FooLongImpl
. It's hard to say without knowing more about what you're trying to achieve.
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