2

我将Face接口定义如下:

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

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

public interface Type{}

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

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 不允许这样做。那么为了做到这一点,我应该如何实现这两个不同的类呢?或者有更好的方法来做到这一点?

4

1 回答 1

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您将收到编译器警告,因为您会将 a 强制转换Face<Something>为 a Face- 即原始类型。

于 2013-04-11T11:16:25.040 回答