我收到以下代码的编译错误。 ?意味着接受我们指定的任何类型的东西。我有Object类型并传递Object类型。但我收到编译错误的原因是什么?
NavigableSet<?> set = new TreeSet<Object>();
set.add(new Object());
答案 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
没有符合此条件的方法,因此找不到方法。