Suppose I have some class Edge<A, B> with subclasses that provide the parameterization, e.g class MyEdge extends Edge<MyNodeType, MyOtherNodeType>
I am currently declaring another class that uses Edges as so:
class EdgeHolder<E extends Edge<A, B>, A, B> {
A getFirstNode();
B getSecondNode();
}
and using it as such:
EdgeHolder<MyEdge, MyNodeType, MyOtherNodeType> var = ...
This feels awfully clunky, especially since MyNodeType and MyOtherNodeType are specified in MyEdge's definition.
I'd love to be able to name the parameters A and B in the definition of EdgeHolder because I need compile-time type-checking on its methods' return type, but I don't want to have to specify A and B when I declare variables of type EdgeHolder.
Is there a way to do this (or something like it)?
If not, why not?
There is no type alias in Java, but you can try use this approach.
class Edge<A, B> {
class MyEdgeHolder<E extends Edge<A, B>> extends EdgeHolder<E, A, B> {}
}
class MyEdge extends Edge<MyNodeType, MyOtherNodeType> {
class MyEdgeHolder extends Edge<MyNodeType, MyOtherNodeType>.MyEdgeHolder<MyEdge> {}
}
Use it like this:
MyEdge.MyEdgeHolder var;
Edge<?, ?>.MyEdgeHolder<?> var2 = var;
This approach is very limited, but may fit your specific scenario.
The best idea I could come to reduce typing yet preserve type checking at compile time:
class Edge<A, B> {
A src;
B dest;
}
class EdgeHolderBase<A, B, E extends Edge<A,B>> {
Edge<A,B> in_hold;
}
// explicit specialization of generics
class MyEdge
extends Edge<Integer, Long> {
}
class MyEdgeHolder
extends EdgeHolderBase<Integer, Long, MyEdge> {
// --- One off excessive typing -- ^
}
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