java – 如何用更具体的类型替换参数化类型
发布时间:2020-12-15 03:09:37 所属栏目:Java 来源:网络整理
导读:请考虑以下设置: 我们有一个SuperType接口,参数化如下: public interface SuperTypeV {} SuperType支持方法链接.因此它定义了另一个类型参数,它捕获每个方法返回的具体实现子类型,如下所示: public interface SuperTypeV,S extends SuperTypeV,S { public
请考虑以下设置:
我们有一个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); 可能有一些不安全的情况虽然我还没有找到,欢迎任何批评! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |