我对Java泛型中的嵌套嵌套通配符有疑问。
这是一个常见的情况:
public void doSomething(Set<? extends Number> set) {}
public void callDoSomething() {
Set<Integer> set = new HashSet<Integer>();
doSomething(set);
}
这是标准的Java泛型,工作正常。
但是,如果通配符嵌套,它将不再起作用:
public void doSomething(Map<String, Set<? extends Number>> map) {}
public void callDoSomething() {
Map<String, Set<Integer>> map = new HashMap<String, Set<Integer>>();
doSomething(map);
}
这会导致编译器错误。
我已经尝试了各种强制类型转换和通配符置换,但是无法正常工作。我不记得以前曾见过此问题,并且我使用泛型已有多年。我是否太累了,缺少明显的东西?
所以问题是,doSomething
可以实现为:
public void doSomething(Map<String, Set<? extends Number>> map) {
Set<Float> set = ...;
map.put("xyz", set);
}
您需要确定您的实际意思。
大概是这样的:
public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}
问题内容: 发现了有关使我烦恼的无限制通配符的事实。例如: 尽管可以使用或返回类型,但失败。 有人可以告诉我确切原因吗?提前致谢。 更新资料 我认为,对于此问题,我似乎理解并最简单的解释(忽略所有这些复杂的规则)是Capture Conversion(link)中的最后一个注释: 问题答案: 了解通配符类型的含义很重要。 您已经了解了,您可以将您的as 隐式指定为任意类型,而对于任何可能引用了声明
问题内容: 这样编译(1.6) 但这不是 的错误 有人可以解释为什么吗?谢谢 编辑:编辑为结果 问题答案: 因为这会破坏类型安全性:
问题内容: 为什么这样做: 虽然这会产生类型不匹配错误: 为什么是这样?是否有办法解决此问题,而不使用原始类型? 问题答案: 尝试 注意:请注意,当您使用类似List的集合时,您只能在“只读”模式下使用它(添加空值除外)。
问题内容: 在以下示例中: 为什么对second(b)的调用有效,但对third(a)的调用却无效 ? 我收到以下错误: 问题答案: 如果您希望能够使用自变量进行调用,则需要将签名更改为此: 将上面的工作,因为不像,是兼容。这样想: 推理很简单。如果你有 然后,如果您 可以这样 调用该方法:
问题内容: 让我们首先考虑一个简单的场景(请参阅ideone.com上的完整源代码): 这两个通配符是无关的,这就是为什么你可以doNothing使用和a 进行调用的原因。换句话说,两者?可以指完全不同的类型。因此,以下内容无法编译,这是可以预期的(同样在ideone.com上): 到目前为止,一切都很好,但是这里的事情开始变得非常混乱(如ideone.com所示): 上面的代码可以在Eclips
这可能是一个简单的问题,但谷歌什么也没有回报。 我已经阅读了java中的帮助包-导入不工作 我仍然不明白为什么直接导入可以工作,但通配符不行。[编辑]我所说的类包是指一个类包。我对Java还是新手,所以我不知道语义学[编辑] 我有一个课程包:,当我尝试导入com时。公司* 我收到以下错误。 如果我导入明确表示我没有问题。 所以我想我有一个解决方案,但为了学习,有人能解释一下我为什么会看到这个问题吗