这是我的代码:
Object[] data = GeneComparison.readData(files);
MyGenome genome = (MyGenome) data[0];
LinkedList<Species> breeds = (LinkedList<Species>) data[1];
Run Code Online (Sandbox Code Playgroud)
它为LinkedList提供此警告:
Type safety: Unchecked cast from Object to LinkedList<Species>
Run Code Online (Sandbox Code Playgroud)
为什么它会抱怨链表而不是MyGenome?
cle*_*tus 12
当你将非参数化类型(Object)转换为参数化类型(LinkedList)时,Java会抱怨这样.它告诉你它可能是任何东西.它与第一个强制转换没有什么不同,除非第一个将生成ClassCastException,如果它不是那个类型但第二个不会.
这一切都归结为类型擦除.运行时的LinkedList实际上只是一个LinkedList.您可以在其中放置任何内容,它不会像第一个示例那样生成ClassCastException.
经常要摆脱这个警告你必须做的事情如下:
@SuppressWarning("unchecked")
public List<Something> getAll() {
return getSqlMapClient.queryForList("queryname");
}
Run Code Online (Sandbox Code Playgroud)
其中queryForList()返回一个List(非参数化),你知道内容将是Something类.
另一方面是Java中的数组是协变的,这意味着它们保留了运行时类型信息.例如:
Integer ints[] = new Integer[10];
Object objs[] = ints;
objs[3] = "hello";
Run Code Online (Sandbox Code Playgroud)
会抛出异常.但:
List<Integer> ints = new ArrayList<Integer>(10);
List<Object> objs = (List<Object>)ints;
objs.add("hello");
Run Code Online (Sandbox Code Playgroud)
是完全合法的.
因为这里:
MyGenome genome = (MyGenome) data[0];
Run Code Online (Sandbox Code Playgroud)
您没有使用泛型
和这里
LinkedList<Species> breeds = (LinkedList<Species>) data[1];
Run Code Online (Sandbox Code Playgroud)
你正在使用它们。
这只是一个警告,您正在混合数据数组中的类型。如果您知道自己在做什么(我的意思是,如果第二个元素确实包含 LinkedList ),您可以忽略该警告。
但更好的是有一个像这样的对象:
class Anything {
private Object [] data;
public Anything( Object [] data ) {
this.data = data;
}
public Gnome getGnome() {
.....
}
public List<Species> getBreeds() {
......
}
}
Run Code Online (Sandbox Code Playgroud)
并且必须在正确的转换之前返回正确的内容,这样你最终会得到:
Anything anything = new Anything( GeneComparison.readData(files) );
MyGenome genome = anything.getGnome(); // similar to data[0]
LinkedList<Species> breeds = anything.getBreeds(); // similar to data[1];
Run Code Online (Sandbox Code Playgroud)
在这些方法中,您必须进行适当的转换。
| 归档时间: |
|
| 查看次数: |
19807 次 |
| 最近记录: |