首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包装工厂方法的泛型类型

包装工厂方法的泛型类型
EN

Stack Overflow用户
提问于 2013-06-30 11:08:05
回答 3查看 648关注 0票数 1

我正试图为包装器创建一个工厂方法,并且我在泛型类型上步履蹒跚。

我有两个类A和B,其中B派生自A,然后我有一个Wrappber基类(WBase),以及A和B的包装类WA和WB。

在编译下面的代码时,我会得到一个

类型安全性:类型测试的泛型方法包装(Class,T)的未检查调用包装(Class,Test.B)

在调用wrap方法时发出警告?知道怎么做对吗?

干杯

代码语言:javascript
复制
public class Test {

    public class A {
    }

    public class B extends A {
    }

    public class WBase<T> {
    }

    public class WA<T extends A> extends WBase<T> {
    }

    public class WB extends WA<B> {
    }

    public <T, W extends WBase<T>> W wrap(Class<W> cls, T item) {
        return null;
    }

    public void test() {
        B b = new B();
        wrap(WA.class, b);
    }
}

更新:

我刚刚解决了我的问题!:-)我找到的解决方案是引入一个额外的包装类WABase,让WA从该类中扩展,并从WA中删除泛型参数:

代码语言:javascript
复制
public class WABase<T extends A> extends WBase<T> {} 
public class WA extends WBase<A> {} 
public class WB extends WABase<B> {} 

此外,我还将包装方法重新定义为

代码语言:javascript
复制
<T, W extends WBase<? super T>> W wrap(Class<W> cls, T item) 

现在一切都很好:

代码语言:javascript
复制
B b = new B(); 
A a = new A(); 
wrap(WB.class, b); 
// wrap(WB.class, a); // does not compile, which is right 
wrap(WA.class, a); 
wrap(WA.class, b);

感谢莫嘉诺和纽阿特把我推向了正确的方向。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-30 11:22:10

这部分的问题是:

代码语言:javascript
复制
wrap(WA.class, b)

WA是一个参数化类,当您使用WA.class时,您使用的是"raw“类型。

票数 1
EN

Stack Overflow用户

发布于 2013-06-30 21:58:54

您可以绕过这样一个事实:WA.classClass<WA>,而不是您想要的Class<WA<B>>

代码语言:javascript
复制
wrap((Class<WA<B>>)(Class<?>)WA.class, b);

当然,您会收到未经检查的强制发布警告。

票数 2
EN

Stack Overflow用户

发布于 2013-06-30 11:26:41

由于bB类型的,那么在wrap(WA.class, b)调用中TB。由于TB,那么作为第一个参数传递的Class实例的类型化变量必须扩展WBase<B>WA.class的类型变量是WA,它显然扩展了WBase<T>

但是T in public class WA<T extends A> extends WBase<T> 并不是中的这是两个独立的T,如果你用(比方说,S )切换一个T,你会发现它仍然可以编译。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17389735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档