以下代码出现编译错误,问号表示接受任何类型的赋值。我有一个Object类型并传递Object类型,但为什么会出现编译错误呢?
NavigableSet<?> set = new TreeSet<Object>();
set.add(new Object());
以下代码出现编译错误,问号表示接受任何类型的赋值。我有一个Object类型并传递Object类型,但为什么会出现编译错误呢?
NavigableSet<?> set = new TreeSet<Object>();
set.add(new Object());
对于变量NavigableSet<?>
,编译器只知道它是一个NavigableSet
,但不知道具体的类型,因此不能安全地添加任何对象。
例如,以下可能就是这样的代码:
NavigableSet<?> set = new TreeSet<String>(); // ? could be String
set.add(new Object()); // can't add Object to a Set<String>
使用<?>
会丢失变量的具体类型,因此无法进行加法运算。
因此,您需要编写:
NavigableSet<Object> set = new TreeSet<Object>();
set.add(new Object());
对于类型为?
的情况,在编译时无法确定类型。当方法不依赖于类型时,我们使用 ?
。因为add
方法依赖于类型,所以?
不适用于此。
Java编译器将尝试查找与方法名称、提供的参数的数量和类型匹配的方法签名。因此,让我们对您的方法做同样的事情。
name: add
number of arguments: 1
type: ? // Your issue.
然而,NavigableSet
没有符合此条件的方法,因此找不到任何方法。
当您声明NavigableSet<?> set
时,您的方法add看起来像add(? arg)
。Java无法从?
中检索类型。
这与PECS原则有关。
要解决这个问题,只需使用super
作为通配符。
NavigableSet<? super Object> set = new TreeSet<>();