java - 使用 List<?> 成员定义抽象泛型类

标签 java generics inheritance

即使尝试为此想出一个干净的标题也是一个挑战。

基本思想是定义两个父类(super class):一个用于“子”项目,其成员引用其“父”,另一个用于包含子对象的“父”列表。从 child->parent 和 parent->child 的链接是对称的。每个父/子父类(super class)都有定义和实现附加功能的子类。总有一个并行子类使得 child<A>parent<A> 配对.即 parent<A>将只包含 child<A>引用资料,以及 child<A>只会引用 parent<A> - 子类型之间没有“交叉”。

我该如何表示呢?几天来我一直坚持这个问题,我对多级嵌套泛型类型的创意越多,它就越糟糕。这就是我想要做的:

abstract class ChildBase<T extends ChildBase<T>> {
    ParentBase<T> parent;
}
abstract class ParentBase<T extends ChildBase<T>>  {
    LinkedList<T> childList;
}
class ChildSub extends ChildBase<ChildSub> {
    // ... class specific stuff
}
class ParentSub extends ParentBase<ChildSub> {
    // ... class specific stuff
}

这是一团糟。我怀疑有一种更简单、更直接的方法可以做到这一点,而且它的方向可能完全不同。

最佳答案

你是说 class ParentSub extends ParentBase<ChildSub>

如果您进行这一项更改,则全部编译。

This is a mess. I suspect that there is a much simpler, straightforward way of doing this and it's probably in a totally different direction.

实际上,与我见过的其他一些使用泛型的方式相比,这一点也不糟糕。没有完全不同的方法可以实现您所缺少的。

唯一的选择(我认为你应该认真考虑)是制作 ChildBaseParentBase非泛型,只在必要时使用强制转换。泛型被引入该语言以帮助程序员编写正确的、类型安全的程序。当您的类之间存在复杂或循环关系时,弄清楚如何正确使用泛型会变得非常困难和耗时,以至于根本不存在使用泛型的好处。

关于java - 使用 List<?> 成员定义抽象泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33683582/

相关文章:

java - 代码在破坏返回类型的泛型约束时编译

java - 这是将 Java 泛型付诸实践的正确方法吗?

Java Web 应用程序在一段时间后停止工作

java - 我如何进行像 5' 3"1/2 这样的测量,然后将其乘以 1.414 并在 android java 上以相同的格式显示答案

c# - 你能找到一个接受 2 个通用类型但不管这些类型的对象吗?

python - 将父类(super class)实例转换为子类实例

java - 为什么继承在 Java 和 C++ 中的行为不同,父类(super class)调用(或不调用)子类的方法?

c++ - 如何编写子类相互依赖的基类?

java - 如何使用java识别图像中的字符?

java - 从字符串读取直到 Android 中的特定字符