我定义了Face接口(interface)如下:
public interface Face {
<R> LoadBalancer<R> create(List<R> resources);
}
然后是另一个接口(interface) Type
和两个实现 Face
接口(interface)的类。
public interface Type{}
这是名为 FaceImpl1 的 Face
接口(interface)的第一个实现。
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
限制为在 FaceImpl1
中实现 Type
接口(interface)的类,但在类FaceImpl2
,我不需要这个限制。
问题是 Java 不允许这样做。那么为了做到这一点,我应该如何实现这两个不同的类?或者有更好的方法来做到这一点?
最佳答案
您可以通过设置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
中定义的合约正如契约(Contract)所说“任何类型 R
”,并且您使您的方法更具约束力。
想想当有人这样做时会发生什么:
final FaceImpl1 face1 = new FaceImpl1();
final Face face = (Face) face1;
这是完全有效的,但在您的尝试下,您现在失去了任何类型限制。
如果将类型添加到 interface
您将收到编译器警告,因为您将转换 Face<Something>
到 Face
- 即原始类型。
关于java - 如何用不同的方式实现同一个接口(interface)的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15947187/