4

我试图找到一种方法来创建一个接口/抽象方法,并将声明/扩展类作为返回类型。(例如classA 扩展了interfaceA,并且该方法应该返回一个ClassA 对象)。

现在我发现一些帖子编译器不会抱怨这样的事情,但是 JVM 无法处理这样的事情,这意味着这个机制在 java 中不存在。

所以我想出了以下想法,我不知道它在技术上是否足够节省。(例如它会导致循环)

public interface ISomeInterface<T extends ISomeInterface<T>> {
    public T get();
}

这意味着您可以以这种方式使用它。虽然这不会强制外部用户使用扩展类,但如果愿意,它至少提供了这样做的机会:

public class ExtendingClass implements ISomeInterface<ExtendingClass>{
    @Override
    public ExtendingClass get(){}
}

现在这不会产生编译器或运行时错误,但我担心如果广泛使用这是否会产生任何问题。

如果有人能确认这会或不会导致问题,我将不胜感激。(也欢迎任何其他反馈)。

4

2 回答 2

2

这没有什么问题。这实际上是一种相当普遍的做法。

于 2016-04-02T19:34:53.163 回答
2

这是一种非常普遍的做法。示例包括:

Enum<E extends Enum<E>>

BaseStream<T, S extends BaseStream<T, S>>

但是,请确保您了解这些限制。主要的是它不适用于继承。

例如,如果您有一个接口

interface Animal<A extends Animal<A>>

你可能决定写一个像这样的具体实现

class Duck implements Animal<Duck>

这很好用,但如果你后来决定要扩展Duck,你将无法这样写:

class MallardDuck extends Duck implements Animal<MallardDuck>

你不能这样做的原因是你不能用两个不同的类型参数实现同一个泛型接口——因为Duck已经实现Animal<Duck>了,所以不可能MallardDuck实现Animal<MallardDuck>

因此,请确保如果您使用此模式,您会非常仔细地考虑您打算如何实现接口。它之所以有效,Enum是因为该语言不允许您扩展它们,但如果使用太多,这种模式会造成一团糟。

于 2016-04-02T20:03:47.817 回答