假设我有一些class Edge<A, B>
带有提供参数化的子类,例如class MyEdge extends Edge<MyNodeType, MyOtherNodeType>
我目前正在声明另一个使用Edge
s的类:
class EdgeHolder<E extends Edge<A, B>, A, B> {
A getFirstNode();
B getSecondNode();
}
并使用它:
EdgeHolder<MyEdge, MyNodeType, MyOtherNodeType> var = ...
这感觉非常笨重,特别是因为MyNodeType
和MyOtherNodeType
在MyEdge
的定义中指定了。
我希望能够在A
的定义中命名参数B
和EdgeHolder
因为我需要编译时类型检查在其方法的返回类型上,但我不想在声明A
类型的变量时指定B
和EdgeHolder
。
有没有办法做到这一点(或类似的东西)?
如果没有,为什么不呢?
答案 0 :(得分:3)
Java中没有类型别名,但您可以尝试使用此方法。
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> {}
}
像这样使用:
MyEdge.MyEdgeHolder var;
Edge<?, ?>.MyEdgeHolder<?> var2 = var;
这种方法非常有限,但可能适合您的具体情况。
答案 1 :(得分:1)
我最好的办法是减少打字,但在编译时保留类型检查:
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 -- ^
}