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

Java—在接口/抽象方法上将类扩展为返回类型,java,generics,nested-generics,Java,Generics,Nested Generics,我试图找到一种方法来创建一个接口/抽象方法,将类声明/扩展为返回类型。(例如,classA扩展了interfaceA,该方法应返回classA对象) 现在我发现了一些帖子,编译器不会抱怨这样的事情,但是JVM不能处理这样的事情,这意味着java中根本不存在这种机制 所以我提出了以下想法,从技术上来说,我不知道这是否足够省钱。(例如,它是否会导致循环) 公共接口{ 公众不能得到(); } 也就是说你可以这样使用它。虽然这不会强制外部用户使用扩展类,但如果愿意,至少可以这样做: public cl

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

现在我发现了一些帖子,编译器不会抱怨这样的事情,但是JVM不能处理这样的事情,这意味着java中根本不存在这种机制

所以我提出了以下想法,从技术上来说,我不知道这是否足够省钱。(例如,它是否会导致循环)

公共接口{
公众不能得到();
}
也就是说你可以这样使用它。虽然这不会强制外部用户使用扩展类,但如果愿意,至少可以这样做:

public class ExtendingClass implements ISomeInterface<ExtendingClass>{
    @Override
    public ExtendingClass get(){}
}
public类ExtendingClass接口{
@凌驾
公共扩展类get(){}
}
现在,这不会给出编译器或运行时错误,但我担心如果广泛使用,是否会产生任何问题


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

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

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

Enum<E extends Enum<E>>

BaseStream<T, S extends BaseStream<T, S>>
您不能这样做的原因是您不能用两个不同的类型参数实现相同的通用接口-因为
Duck
已经实现了
Animal
,所以
MallardDuck
不可能实现
Animal


因此,请确保如果您使用此模式,您将非常仔细地考虑如何实现该接口。它适用于
Enum
,因为该语言不允许您扩展它们,但如果使用太多,这种模式可能会造成混乱。

我认为这很好。这与Java用于
enum
类型的模式相同,它们被声明为:这怎么不会给您带来编译错误?实现类不是抽象类,因此需要一个方法体。@Makoto这会给出一个错误:D,这只是一个示例。现在改了。@markspace好吧,我不知道那个。这对我来说已经足够安全了:D,非常感谢!好的,谢谢。我当然希望有一天会有一个更好的解决方案。这似乎是合乎逻辑的。虽然这不是正常接口的情况吗?它基本上是隐藏泛型。虽然我明白你的意思,但是因为这个方法的returnType为'Duck'(在本例中),所以子类不能再更改这个返回类型了。尽管这与常规接口没有什么不同。无论如何,谢谢你指出。
Enum<E extends Enum<E>>

BaseStream<T, S extends BaseStream<T, S>>
interface Animal<A extends Animal<A>>
class Duck implements Animal<Duck>
class MallardDuck extends Duck implements Animal<MallardDuck>