Java - 在接口/抽象方法上将类扩展为返回类型

时间:2016-04-02 19:30:35

标签: java generics nested-generics

我试图找到一种方法来创建一个接口/抽象方法,并将声明/扩展类作为返回类型。 (例如,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(){}
}

现在这没有给出编译器或运行时错误,但我担心如果广泛使用会造成任何问题。

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

2 个答案:

答案 0 :(得分:2)

这没什么不对。这实际上是一种相当普遍的做法。

答案 1 :(得分:1)

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

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一起使用,因为该语言不允许您扩展它们,但如果使用太多,这种模式可能会造成混乱。

相关问题