Java Generics Name类型参数,不需要它

时间:2016-09-23 13:40:55

标签: java generics types

假设我有一些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 = ...

这感觉非常笨重,特别是因为MyNodeTypeMyOtherNodeTypeMyEdge的定义中指定了。

我希望能够在A的定义中命名参数BEdgeHolder因为我需要编译时类型检查在其方法的返回类型上,但我不想在声明A类型的变量时指定BEdgeHolder

有没有办法做到这一点(或类似的东西)?

如果没有,为什么不呢?

2 个答案:

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

}