Java中的泛型对象赋值

4

以下代码出现编译错误,问号表示接受任何类型的赋值。我有一个Object类型并传递Object类型,但为什么会出现编译错误呢?

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

@Sanjeev> 在类型Set<capture#1-of ?>中,方法add(capture#1-of ?)不适用于参数(Object)。 - Mohsen Kamrani
可能是泛型的泛型如何工作?的重复问题。 - Dirk
它的意思是你不能向集合添加任何内容,但可以从中读取。阅读Java泛型。 - vikeng21
4个回答

4

对于变量NavigableSet<?>,编译器只知道它是一个NavigableSet,但不知道具体的类型,因此不能安全地添加任何对象。

例如,以下可能就是这样的代码:

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

0

使用<?>会丢失变量的具体类型,因此无法进行加法运算。

因此,您需要编写:

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

0

对于类型为?的情况,在编译时无法确定类型。当方法不依赖于类型时,我们使用 ?。因为add方法依赖于类型,所以?不适用于此。

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

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

然而,NavigableSet没有符合此条件的方法,因此找不到任何方法。


0

当您声明NavigableSet<?> set时,您的方法add看起来像add(? arg)。Java无法从?中检索类型。

这与PECS原则有关。

要解决这个问题,只需使用super作为通配符。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接