Java接口和返回类型

Java接口和返回类型,java,generics,interface,types,return,Java,Generics,Interface,Types,Return,假设我有以下接口: public interface A { public void b(); } 但是,我希望实现它的每个类对于方法b()都有不同的返回类型 示例: public class C { public C b() {} } public class D { public D b() {} } 如何定义接口以实现此目的?如果返回类型必须是实现接口的类的类型,则您需要的称为: 公共接口A{public T b();} 公共类C实现了{ 公共C b(){…} } 公

假设我有以下接口:

public interface A { public void b(); }
但是,我希望实现它的每个类对于方法b()都有不同的返回类型

示例:

public class C { 
  public C b() {} 
}

public class D { 
  public D b() {} 
}

如何定义接口以实现此目的?

如果返回类型必须是实现接口的类的类型,则您需要的称为:

公共接口A{public T b();}
公共类C实现了{
公共C b(){…}
}
公共类D实现了{
公共D b(){…}
}
换句话说,
A
正在声明一个类型参数
T
,该参数将接受实现
A
的每个具体类型的值。这通常用于声明类型良好的
clone()
copy()
方法。作为另一个示例,它用于声明每个枚举继承的
compareTo(E)
方法仅适用于该特定类型的其他枚举

如果您经常使用此模式,您将遇到需要
this
T
类型的场景。乍一看,它似乎是1,但实际上您需要声明一个
抽象T getThis()
方法,实现者必须将该方法作为
返回来实现

[1] 正如评论人士所指出的,如果
X
Y
正确合作,就有可能做一些鬼鬼祟祟的事情,比如
X实现一个
。一个
T getThis()
方法的出现使得
X
绕过了
a
接口的作者的意图变得更加清晰。

泛型

public interface A<E>{
    public E b();
}

public class C implements A<C>{
    public C b(){
        return new C();
    }
}

public class D implements A<D>{
    public D b(){
        return new D();
    }
}
公共接口A{
公共E b();
}
公共类C实现了{
公共图书馆{
返回新的C();
}
}
公共类D实现了{
公共发展局(){
返回新的D();
}
}
在泛型中搜索更多细节,但是(非常)基本上,
A
E
的类型留给实现类(
C
D

因此,基本上A不知道(也不必知道)在任何给定的实现中E可能是什么。

自Java(自Java 1.5以来),您可以:

public interface A { public Object b(); }

不太好。您希望您的界面为意外误用留出尽可能小的空间。使用这样的方法,编程人员在实现
a
时很容易出错。问题并没有明确指定对覆盖类型的任何限制。当然,如果存在这样的限制,我们应该在可行的情况下使用接口来实施它们。离题:这样的语法就是我尽可能避免创建泛型API的原因。答案不错(也是泛型功能的一个很好的例子),但这并不妨碍程序员使用C实现(见我的第二个答案)。@Matt McHenry:为什么要指定嵌套泛型类型?@Matt McHenry:有什么具体的原因,为什么要执行A而不仅仅是A?最后一次对
A
的引用是原始类型。除了遗留代码之外,任何东西都应该避免这种情况。我更喜欢那个标记为“the”的类型答案是,因为您不必依赖于实现者将在泛化声明中实际包含他们的类名这一事实。
public interface A { public Object b(); }