不需要它的Java泛型名称类型参数

标签 java generics types

<分区>

假设我有一些 class Edge<A, B>带有提供参数化的子类,例如 class MyEdge extends Edge<MyNodeType, MyOtherNodeType>

我目前正在声明另一个使用 Edge 的类就这样:

class EdgeHolder<E extends Edge<A, B>, A, B> {
    A getFirstNode();
    B getSecondNode();
}

并这样使用它:

EdgeHolder<MyEdge, MyNodeType, MyOtherNodeType> var = ...

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

我希望能够命名参数 ABEdgeHolder 的定义中因为我需要对其方法的返回类型进行编译时类型检查,但我不想指定 AB当我声明 EdgeHolder 类型的变量时.

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

如果不是,为什么不呢?

最佳答案

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;

这种方法非常有限,但可能适合您的特定场景。

关于不需要它的Java泛型名称类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39662305/

相关文章:

java - Java 中的继承,表面类型与实际类型

JavaFX-如何保存从 ChoiceBox 中选择的

java - 泛型和( super ?)类型标记可以帮助构建类型安全的新闻聚合器吗?

java - 在 Java 中转换迭代器类型

c++ - 我可以在 for 循环的 init-expression 中使用不同的类型吗?

haskell - 有趣的类型!解析多个实例声明

java - la4j 显性特征值 - 将命令式算法转换为 java 8 中的函数式风格

java - java 15 的 h2o 构建失败

java - 扫描 Web 容器文件夹中的文件

java - 陷入泛型困境