Java接口和返回类型

时间:2010-03-10 01:08:19

标签: java generics interface types return

考虑我有以下界面:

public interface A { public void b(); }

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

示例:

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

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

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

3 个答案:

答案 0 :(得分:48)

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

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() { ... }
}

简而言之,A声明了一个类型参数T,它将采用实现A的每个具体类型的值。这通常用于声明类型良好的clone()copy()方法。另一个例子是java.lang.Enum使用它来声明每个枚举的继承compareTo(E)方法仅适用于该特定类型的其他枚举。

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

[1]正如评论者指出的那样,如果X implements A<Y>X正确合作,可能会像Y那样偷偷摸摸地做些事情。 T getThis()方法的存在使X更明确地规避了A接口作者的意图。

答案 1 :(得分: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();
    }
}

搜索泛型以获取更多详细信息,但(非常)基本上,正在发生的事情是AE的类型留给实施条款(C和{{1} })。

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

答案 2 :(得分:2)

自Java supports covariant return types(自Java 1.5起)以来,您可以这样做:

public interface A { public Object b(); }