Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Generics Name type parameter without requiring it [duplicate]

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?

like image 899
Thomas Shields Avatar asked Jan 19 '26 05:01

Thomas Shields


2 Answers

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.

like image 190
talex Avatar answered Jan 21 '26 23:01

talex


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 -- ^

}
like image 23
Adrian Colomitchi Avatar answered Jan 21 '26 23:01

Adrian Colomitchi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!