未选中的转化警告

时间:2011-12-27 04:21:39

标签: java generics unchecked

以下是我的界面定义

interface IStorage {
   <T extends ICommon> Collection<T> find(String name, boolean isExact);
}

这是实施

Storage implements IStorage {
    Collection<IOrganization> find(String name, boolean isExact) {
       //some code
    }
}

IOrganization是ICommon的子类型。

为什么我仍然会看到未经检查的转化警告?

3 个答案:

答案 0 :(得分:3)

因为您编写了接口,所以find()会返回Collection 某些扩展ICommon

您的实现正在返回Collection {em}特定子类 ICommon。就编译器而言,这是一个未经检查的转换;如果Collection实际上包含ICommon的其他子类?

会发生什么

答案 1 :(得分:0)

在定义Storage时保留相同的签名,因为您仍在定义方法find(并且不使用它):

Storage implements IStorage {
    <T extends ICommon> Collection<T> find(String name, boolean isExact) {
       //some code
    }
}

在实际调用该泛型方法时,您将指定具体的类型参数:

Storage s = new Storage();
s.<IOrganization>find("hello world", true);

但是您在泛型方法中使用T引入的参数类型<T extends ICommon>没有用,因为您没有参数列表。

可能是您可能想要的不是通用方法。但事情如下:

interface IStorage {
    public Collection<? extends ICommon> find(String name, boolean isExact);
}

//and
class Storage implements IStorage {
    public Collection<IOrganization> find(String name, boolean isExact) {
        //some code                
    }
}

//or 
class Storage implements IStorage {
    public Collection<? extends ICommon> find(String name, boolean isExact) {
        //some code  
    }
}

答案 2 :(得分:0)

当你有一个像<T extends ICommon> Collection<T> find(...这样的通用方法时,这意味着调用者可以要求T成为他们想要的任何东西。这意味着该方法必须适用于任何此类型T,而不是能够选择特定的T(您似乎想要做什么)。为了演示,您的通用方法允许调用者说出

IStorage obj = ...;
Collection<SomeRandomClassImplementingICommon> foo = obj.find(...);

但您的Collection<IOrganization> find(...方法与上述方法不兼容,因为它不会返回Collection<SomeRandomClassImplementingICommon>类型。