以下是我的界面定义
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的子类型。
为什么我仍然会看到未经检查的转化警告?
答案 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>
类型。