下面是我的代码:

Object[] data = GeneComparison.readData(files);
MyGenome genome = (MyGenome) data[0];
LinkedList<Species> breeds = (LinkedList<Species>) data[1];

它给此警告对于链表:

Type safety: Unchecked cast from Object to LinkedList<Species>

为什么会抱怨链表,而不是MyGenome?

有帮助吗?

解决方案

由于这里:

MyGenome genome = (MyGenome) data[0];

您没有使用泛型

和这里

LinkedList<Species> breeds = (LinkedList<Species>) data[1];

正在使用它们。

这只是一个警告,则在数据阵列中的混合类型。如果你知道你在做什么(我的意思是,如果第二个元素做包含的的LinkedList 的),你可以忽略此警告。

但是,更好的是将有这样一个目的:

class Anything {
    private Object [] data;
    public Anything( Object [] data ) {
         this.data = data;
    }
    public Gnome getGnome() {
    .....
    }
    public List<Species> getBreeds() {
    ......
    }
 }

和这样你最终必须正确的转换之前返回正确的东西,的方法:

Anything anything = new Anything( GeneComparison.readData(files) );
MyGenome genome             = anything.getGnome(); // similar to data[0]
LinkedList<Species> breeds = anything.getBreeds(); // similar to data[1];

在那些你必须做正确的变换方法。

其他提示

爪哇抱怨这样当你施放非参数型(对象)的参数化类型(链表)。这是要告诉你,它可以是任何东西。这是对除第一个第一投真的没有不同会产生一个ClassCastException如果不是这种类型,但第二个则不会。

这一切都归结到类型擦除。在运行一个LinkedList是真的只是一个LinkedList。你可以把任何东西在里面,它不会产生像第一个例子一个ClassCastException。

通常摆脱这种警告,你必须做的是这样的:

@SuppressWarning("unchecked")
public List<Something> getAll() {
  return getSqlMapClient.queryForList("queryname");
}

其中的queryForList()返回一个列表(非参数化),其中要知道的内容将是类的东西。

在其它方面这是一个用Java阵列的协变下,这意味着它们保留运行时类型信息。例如:

Integer ints[] = new Integer[10];
Object objs[] = ints;
objs[3] = "hello";

将抛出异常。但是:

List<Integer> ints = new ArrayList<Integer>(10);
List<Object> objs = (List<Object>)ints;
objs.add("hello");

是完全合法的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top