java – 如何用更具体的类型替换参数化类型
|
请考虑以下设置: 我们有一个SuperType接口,参数化如下: public interface SuperType<V> {
}
SuperType支持方法链接.因此它定义了另一个类型参数,它捕获每个方法返回的具体实现子类型,如下所示: public interface SuperType<V,S extends SuperType<V,S>> {
public S doSomething();
}
让我们考虑SuperType< V,S的实现扩展SuperType< V,S>>: public class SubType<V> implements SuperType<V,SubType<V>> {
private final V value;
public SubType(V value) { this.value = value; }
public SubType<V> doSomething() { return this; }
}
有人实例化SubType< V>使用例如字符串,但为类型参数V提供Object: Object s = "Java Generics"; SubType<Object> x = new SubType<>(s); 现在我们想要为SuperType< V,S扩展SuperType< V,S>>定义另一种方法.它采用V的更具体的类型参数并返回相同的实现类型S但现在用W扩展V参数化: public interface SuperType<V,S>> {
public S doSomething();
public <W extends V,T extends SuperType<W,T>> T doMoreSpecific(Class<W> typeToken);
}
此新接口定义旨在支持: Object s = "Java Generics"; SubType<Object> x = new SubType<>(s); SubType<String> y = x.doMoreSpecific(String.class); 在这里,我很难实现SubType< V>.我想提供的实现是: public class SubType<V> implements SuperType<V,SubType<V>> {
private final V value;
public SubType(V value) { this.value = value; }
public SubType<V> doSomething() { return this; };
public <W extends V> SubType<W> doMoreSpecific(Class<W> typeToken) {
return new SubType<>((W) value);
}
}
我的问题是: 我应该如何为SuperType< V,S>>类型中的方法doMoreSpecific()定义签名.以便实施提供 或者,哪种实现和接口方法定义可以解决问题? 或者,为什么我们不能用Java做到这一点? 解决方法使用以下签名:<W extends V> SuperType<W,?> doMoreSpecific(Class<W> typeToken); 可能有一些不安全的情况虽然我还没有找到,欢迎任何批评! (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
