Java 接口和返回类型

2022-09-01 07:11:58

考虑我有以下接口:

public interface A { public void b(); }

但是,我希望实现它的每个类对方法b()具有不同的返回类型。

例子:

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

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

如何定义我的接口,以便实现这一点?


答案 1

如果返回类型必须是实现接口的类的类型,则所需的类型称为 F 有界类型

public interface A<T extends A<T>>{ public T b(); }

public class C implements A<C>{
  public C b() { ... }
}

public class D implements A<D>{
  public D b() { ... }
}

换句话说,是声明一个类型参数,该参数将采用实现的每个具体类型的值。这通常用于声明诸如或类型良好的方法之类的内容。作为另一个例子,java.lang.Enum使用它来声明每个枚举的继承方法仅适用于该特定类型的其他枚举。ATAclone()copy()compareTo(E)

如果您经常使用此模式,则会遇到需要键入 .乍一看,它似乎很明显是1,但你实际上需要声明一个方法,实现者必须简单地实现为。thisTabstract T getThis()return this

[1]正如评论者所指出的那样,可以做一些偷偷摸摸的事情,比如如果,并适当地合作。方法的存在使得它更加清楚地表明,它正在规避接口作者的意图。X implements A<Y>XYT getThis()XA


答案 2

泛 型。

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();
    }
}

搜索泛型以获取更多详细信息,但是(非常)基本上,正在发生的事情是将 的类型留给实现分支( 和 )。AECD

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