我将 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不允许这样做。所以为了做到这一点,我该如何实现两个不同的类?或者有更好的方法来做到这一点?
答案 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
- 即原始类型。