java接口中的泛型

java接口中的泛型,java,generics,interface,Java,Generics,Interface,假设我有这个接口(没有参数化) 如何确保copy的任何实现都会返回实际的子类型(而不是MyInterface) 例如 公共Impl实现MyInterface { @凌驾 public Impl copy()您可以指定作为接口子类的泛型类型: interface MyInterface<T extends MyInterface<T>> { T copy(); } class Foo implements MyInterface<Foo> {

假设我有这个接口(没有参数化)

如何确保
copy
的任何实现都会返回实际的子类型(而不是
MyInterface

例如

公共Impl实现MyInterface { @凌驾
public Impl copy()您可以指定作为接口子类的泛型类型:

interface MyInterface<T extends MyInterface<T>> {
    T copy();
}


class Foo implements MyInterface<Foo> {
    public Foo copy() {
        return null;
    }
}
接口MyInterface{
T复制();
}
类Foo实现MyInterface{
公开Foo copy(){
返回null;
}
}

您可以指定作为接口子类的泛型类型:

interface MyInterface<T extends MyInterface<T>> {
    T copy();
}


class Foo implements MyInterface<Foo> {
    public Foo copy() {
        return null;
    }
}
接口MyInterface{
T复制();
}
类Foo实现MyInterface{
公开Foo copy(){
返回null;
}
}
假设我有这个接口(未参数化)

如果你想保持它的非参数化,没有一个解决方案能同时满足你的两个例子。而且我不明白如果你在编程接口而不控制接口的实现,你为什么要这样做

假设我有这个接口(未参数化)


如果你想保持它的非参数化,没有一个解决方案可以同时满足你的两个例子。而且我不明白如果你在编程接口而不控制接口的实现,你为什么要这样做。

你不需要担心返回类型的引用。所有事情都是由实际对象来完成的根据。在调用代码中,您可以将返回值从Foo.copy()强制转换为Foo,但首先需要确保您正在对Foo调用copy。您不必担心返回类型的引用。实际对象将按照执行所有操作。在调用代码中,您可以从Foo.copy()强制转换返回值但是你需要首先确保你在一个Foo上调用copy。我不想参数化我的
MyInterface
,因为它在上下文中没有任何意义。不要忽略警告MyInterface是原始类型。对泛型类型MyInterface的引用应该参数化它不是泛型Inside
T扩展MyInterface
我不想参数化我的
MyInterface
,因为它在上下文中没有任何意义。不要忽略警告MyInterface是原始类型。对泛型类型MyInterface的引用应该参数化它在
T扩展MyInterface
public Foo implements MyInterface
{
    @Override
    public MyInterface copy() <<<<< The returns type of this needs to be 'Foo'
    {
        return new Impl();
    }
}
interface MyInterface<T extends MyInterface<T>> {
    T copy();
}


class Foo implements MyInterface<Foo> {
    public Foo copy() {
        return null;
    }
}