具有两种类型的 Java 自引用泛型

标签 java generics inheritance

假设我们有一个这样的抽象类:

abstract class Table<T extends Table<T, P>, P extends Menu<P>> { }

如何正确声明其实现?

public class TableImpl extends Table< **SOMETHING GOES HERE** > { }

我尝试了一些变体,我发现的唯一解决方法是创建额外的类:

public abstract class AbstractMenu extends Menu<AbstractMenu> { }
public abstract class AbstractTable extends Table<AbstractTable, AbstractMenu> { }

然后可以像这样声明 TableImpl:

public class TableImpl extends AbstractTable { }

编辑 1

根据 Ingo 的回答,它现在看起来像这样:

public class MenuAndTableTest {

    public abstract class Table<X extends Table<X>> {

        public abstract <M extends Menu> M getParent();

        public abstract X getThis();
    }

    public abstract class Menu<T extends Menu<T>> {

    }

    public class MenuImpl extends Menu<MenuImpl> {

    }

    public class TableImpl<M extends Menu> extends Table<TableImpl<M>> {

        M parent;

        public TableImpl(M parent) {
            this.parent = parent;
        }

        @Override
        public TableImpl getThis() {
            return this;
        }

        @Override
        public M getParent() {
            return parent;
        }

    }

    @Test
    public void Test() {
        // given
        MenuImpl menuImpl = new MenuImpl();
        // when
        TableImpl<MenuImpl> tableImpl = new TableImpl<>(menuImpl);
        // then
        assertEquals(tableImpl, tableImpl.getThis());
        assertEquals(menuImpl, tableImpl.getParent());
    }
}

但现在一些额外的逻辑出现在 Table 实现中 - 这并不是我想要的。

最佳答案

如果您想要一个可以包含包含菜单的表的表,为什么不将其声明为

class Table<X>

并实例化

Table<Table<Menu>>

关于具有两种类型的 Java 自引用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29679488/

相关文章:

java - JComponent.setVisible() 在 OS X 上无法成功隐藏分隔符

java - 为什么我不能使用生成器创建通用的 bubbleSort? ( java )

去泛型 - 联合

Java:使对象 "fit"的类型为基类不实现接口(interface)且不能从中继承的类型

java - 什么是间接继承?

Java等待函数

java - 计算两个 unix 时间戳的时间差并在 Java 中转换为分钟

java - 在java中将.obj文件转换为.pdf3D

java - 通用可变参数的警告

node.js - 如何在node.js中实现jade模板继承