gpt4 book ai didi

java - 在具有不同泛型类型的继承层次结构中实现泛型接口(interface)两次

转载 作者:行者123 更新时间:2023-11-29 04:34:47 25 4
gpt4 key购买 nike

我在 Java 中创建了一个通用接口(interface),以便以类型安全的方式表示某物的 ID。它看起来基本上是这样的:

public interface ID<T extends BaseOfAllIDNeedingObjects> {
long getId();
boolean isConcrete();
}

不完全是这样,但对于演示目的来说已经足够接近了。实际的 ID 号是可以获得的,我有各种包装工具可以将 long 转换为 ID 的实例,因此我可以检查我是否拥有 ID 代表的对象或包装器,以防我想转换回对象.这对于单个对象非常有效,但问题是至少我们的一些对象继承了其他对象,并且在某些情况下会使用基类型而不是特定类型。例如:

public class SpecificThing extends BaseThing {
/* stuff */
}

public class BaseThing extends BaseOfAllIDNeedingObjects {
/* stuff that all Things need */
}

当然,我希望能够在不同情况下表示 BaseThing 和 SpecificThing 的 ID。获取 SpecificThing 需要额外的工作来从数据库中的不同表中提取数据,因此有时我只想要一个 BaseThing,因为它具有当时我需要的所有信息。但是,Java 不允许以下内容:

public class BaseThing extends BaseOfAllIDNeedingObjects implements ID<BaseThing> {
/* base thing stuff here */
}

public class SpecificThing extends BaseThing implements ID<SpecificThing> {
/* specific things */
}

这直接就是一个编译器错误。我的 IDE (Jetbrains) 说“ID 不能被不同类型的参数‘BaseThing’和‘SpecificThing’继承”。有什么办法可以解决这个问题吗?我是否只需要不使用 ID 标记 BaseThing,只允许将 SpecificThings 用作 ID,将 BaseThings 包装在单独的 ID 对象中?或者是否有某种我不知道的模式可以让我骗过这样的东西来工作?

最佳答案

您可以将 BaseThing 的实现拉到一个抽象类中,然后使用一个自递归通用参数:

public abstract class AbstractBaseThing<T extends AbstractBaseThing<T>> extends BaseOfAllIDNeedingObjects implements ID<T> {
/* base thing stuff here */
}

public class BaseThing extends AbstractBaseThing<BaseThing> {
/* concrete base thing */
}

public class SpecificThing extends AbstractBaseThing<SpecificThing> {
/* specific things */
}

关于java - 在具有不同泛型类型的继承层次结构中实现泛型接口(interface)两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42119648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com