如何以不同的方式实现相同接口的通用方法?

时间:2013-04-11 11:07:48

标签: java generics override

我将 Face 界面定义如下:

public interface Face {
    <R> LoadBalancer<R> create(List<R> resources);    
}

然后是另一个接口Type和两个实现Face接口的类。

public interface Type{}

这是名为 FaceImpl1 Face接口的第一个实现。

public class FaceImpl implements Face {

    @Override
    public <R extends Type> create<R> newLoadBalancer(List<R> resources) {
        return new SomeObject<R>(resources).
    }
}

又一个实现 FaceImpl2

public class FaceImpl2 implements Face {

    @Override
    public <R> create<R> create(List<R> resources) {
        return new SomeObject2<R>(resources).
    }
}

如您所见,我想将泛型类型R限制为在Type中实现FaceImpl1接口的类,但在类FaceImpl2中,我不需要这个限制。

问题是Java不允许这样做。所以为了做到这一点,我该如何实现两个不同的类?或者有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以通过使interface本身具有有界类型

来实现此目的
interface Face<R> {

    List<? extends R> create(List<? extends R> resources);
}

public interface Type {
}

public class Impl implements Face<Type> {

    @Override
    public List<? extends Type> create(List<? extends Type> resources) {            
    }
}

public class Impl2 implements Face<Object> {

    @Override
    public List<? extends Object> create(List<? extends Object> resources) {
    }
}

否则,该方法未实施interface中定义的合同,因为合同中显示“任何类型R”并且您正在使您的方法更具约束力。

想想当有人这样做时会发生什么:

final FaceImpl1 face1 = new  FaceImpl1();
final Face face = (Face) face1;

这完全有效,但根据您的尝试,您现在会失去任何类型限制。

如果您将类型添加到interface,您将收到编译器警告,因为您要将Face<Something>转换为Face - 即原始类型。