泛型Java中的对象赋值

时间:2014-04-25 13:05:13

标签: java generics collections

我收到以下代码的编译错误。 ?意味着接受我们指定的任何类型的东西。我有Object类型并传递Object类型。但我收到编译错误的原因是什么?

NavigableSet<?> set = new TreeSet<Object>();
set.add(new Object());

4 个答案:

答案 0 :(得分:4)

对于变量NavigableSet<?>,编译器只知道它是NavigableSet,但不知道类型,因此没有对象可以安全添加。

例如,这可能是代码:

NavigableSet<?> set = new TreeSet<String>(); // ? could be String
set.add(new Object()); // can't add Object to a Set<String>

答案 1 :(得分:0)

使用<?>松散变量的具体类型,因此添加无效。

所以你需要写:

NavigableSet<Object> set = new TreeSet<Object>();
set.add(new Object());

答案 2 :(得分:0)

当您声明NavigableSet<?> set时,您的方法添加看起来像add(? arg)。 Java无法检索表单?

这与原则PECS

有关

要解决它,只需使用super作为通配符。

NavigableSet<? super Object> set = new TreeSet<>();

答案 3 :(得分:0)

对于类型?,类型在编译时是不可知的。当方法不依赖于类型时,我们使用?。由于add方法取决于类型,因此?不适合此类。

Java编译器将尝试查找与方法名称,提供的参数的数量和类型相匹配的方法签名。所以,让我们对你做同样的事。

name: add
number of arguments: 1
type: ? // Your issue.

但是,NavigableSet没有符合此条件的方法,因此找不到方法。