java - Java 中的通用类(类型安全)相互依赖

标签 java generics types

我想创建一个抽象集合类(称为 Space)和一个 抽象元素类(称为 Atom)。两者的实例必须相互了解(完全类型化)。 这就是问题所在。

abstract class Space<A extends Atom>{
  // ...
}

abstract class Atom<S extends Space>{
  // ...
}

不好:

“A extends Atom”表示任何 Atom,但不是强类型的

“S extends Space”表示任何空间,但不是强类型空间

我也无法通过以下尝试达到完全类型安全:

abstract class Space<A extends Atom<? extends Space>>
abstract class Atom<S extends Space<? extends Atom>>

abstract class Space<S, A extends Atom<S extends Space<A>>>
abstract class Atom<A, S extends Space<A extends Atom<S>>>

and so on ...

记住,这两个类是抽象的,我希望任何可能的 两个子类根据彼此分类。 这意味着,以下示例中的类 SomeSpace 和 SomeAtom 必须对彼此有很强的“类型知识”:

class SomeSpace extends Space<SomeAtom>
class SomeAtom extends Atom<SomeSpace>

最佳答案

这对我有用,尽管我对所有这些通用约束感到非常困惑。这意味着我不能保证它会做它应该做的事情:

interface ISpace<S extends ISpace<S, A>, A extends IAtom<S, A>> {
        List<? extends IAtom<S, A>> getList(); //// CHANGED
}

interface IAtom<S extends ISpace<S, A>, A extends IAtom<S, A>> {
        S getSpace();
}

abstract class Space<S extends Space<S, A>, A extends Atom<S, A>>
                implements ISpace<S, A> {

        private final List<Atom<S, A>> atoms = new LinkedList<Atom<S, A>>(); ////CHANGED

        public Space() {
        }
        public Space<S, A> getSpace() {
                return this;
        }
        @Override
        public List<Atom<S, A>> getList() {  //// CHANGED
                return atoms;
        }
}

abstract class Atom<S extends Space<S, A>, A extends Atom<S, A>>
                implements IAtom<S, A> {

        private final S space;

        public Atom(S someSpace) {
                this.space = someSpace;
                space.getList().add(this);
        }

        @Override
        public S getSpace() {
                return space;
        }

        public Atom<S, A> getAtom() {
                return this;
        }
}

class Space1 extends Space<Space1, Atom1> {
        public Space1() {
        }
}

class Atom1 extends Atom<Space1, Atom1> {
        public Atom1(Space1 someSpace) {
                super(someSpace);
        }
}

关于java - Java 中的通用类(类型安全)相互依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685408/

相关文章:

apache-flex - 在弹出文本输入控件上设置焦点

Java 流将 excel CSV 收集到基于列的总和过滤的列表中

java - java.time 无法解析秒的小数部分吗?

java - 如何在下拉列表中加载未使用ID的值...隐藏其值已使用的所有记录?

delphi - 检查对象是否继承自泛型类

Java - 枚举值的返回类型

c++ - 将 vector 声明为类数据成员时出错

java - developer.android.com 上的 editText.setOnEditorActionListener 错误

C#/Salesforce : Must Constrain Generic, 无法约束通用

c - 如果定义 float ,是否需要指定 x.yf?