Java接口和返回类型

Jon*_*han 33 java generics types return interface

考虑我有以下界面:

public interface A { public void b(); }
Run Code Online (Sandbox Code Playgroud)

但是我希望实现它的每个类都有一个不同的方法b()的返回类型.

例子:

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

public class D { 
  public D b() {} 
}
Run Code Online (Sandbox Code Playgroud)

我如何定义我的界面以便这可能?

Mat*_*nry 49

如果返回类型必须是实现接口的类的类型,那么您想要的是F-bounded类型:

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() { ... }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,A声明一个类型参数T,它将采用实现的每个具体类型的值A.这通常用于声明类似的类型clone()copy()类型良好的方法.作为另一个例子,它用于java.lang.Enum声明每个枚举的继承compareTo(E)方法仅适用于该特定类型的其他枚举.

如果你经常使用这种模式,你将遇到需要this类型的场景T.乍一看,它似乎很明显是1,但实际上你需要声明一个abstract T getThis()实现者必须轻易实现的方法return this.

[1]正如评论者指出的那样,有可能做一些偷偷摸摸的事情,X implements A<Y>如果X并且Y合作得当.T getThis()方法的存在使得更清楚的X是规避了A界面作者的意图.

  • @Matt McHenry:有什么具体原因吗,为什么你要做 A&lt;T extends A&lt;T&gt;&gt; 而不仅仅是 A&lt;T&gt; ? (3认同)

Cam*_*Cam 37

泛型.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

搜索泛型以获取更多详细信息,但(非常)基本上,正在发生的事情是A叶子E的类型直到执行条款(CD).

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

  • 我更喜欢那个标记为"答案"的那个,因为你不必依赖于实现者实际上将其类名包含在通用声明中的事实.在那一个上竖起大拇指. (3认同)