gpt4 book ai didi

java - 双通配符通用类型错误

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:43:57 46 4
gpt4 key购买 nike

我正在尝试定义一个运算符 ++我的定制 Map像这样输入:

@Override
public MutableMap<K, V> $plus$plus(Map<? extends K, ? extends V> map)
{
HashMap<K, V> copy = this.copy();
map.$plus$plus$eq(map);
return copy;
}

++=运算符定义如下:

public void $plus$plus$eq(Map<? extends K, ? extends V> map);

然而,编译器在 map.$plus$plus$eq(map); 上报错行,出现以下疯狂错误:

The method $plus$plus$eq(Map<? extends capture#10-of ? extends K,
? extends capture#11-of ? extends V>) in the type
Map<capture#10-of ? extends K,capture#11-of ? extends V> is not
applicable for the arguments
(Map<capture#12-of ? extends K,capture#13-of ? extends V>)

如您在此屏幕截图中所见,Eclipse 提供的解决方案均无效,但单独使用甚至有意义:

Eclipse Marker

我使用 Java 泛型已经有一段时间了,甚至为自定义编程开发了我自己的泛型类型系统(我目前正在尝试编写其库),但我以前从未遇到过这样的错误。


编辑:有趣的是,类型转换 map原始类型的参数 (Map)似乎解决了这个问题。

map.$plus$plus$eq((Map) map);

但是,将类型转换更改为 (Map<?, ?>) (这是 Eclipse 的第二个解决方案所做的)导致类似的错误。

最佳答案

如果您使用原始类型 Map 它会起作用,但是你失去了类型安全。不要使用原始类型。它们的存在只是为了与没有泛型的 Java 1.4 及更早版本兼容。

它不适用于通配符,因为编译器不知道通配符的确切类型 ?代表。原因与为什么你不能call add() on a List<? extends T> 的问题相同.

请注意,通配符意味着您可以使用任何类型的对象,其中键的类型扩展为 K并且值的类型扩展了 V .相反,这意味着您有一个 map ,其中的键是一些特定但未知的类型 K ,并且这些值是一些特定但未知的类型 V .你不能调用 $plus$plus$eq在这样的映射上,因为编译器不知道确切的类型,所以无法检查它们。

原则上,Map的通配符您调用该方法的那个,可能代表与 Map 的通配符不同的类型你作为参数传递的 - 即使在这种情况下你可以看到它们必须相同,因为你使用相同的对象 map在这种情况下。

您可以使用类型参数而不是通配符来修复它:

@Override
public <KK extends K, VV extends V> MutableMap<K, V> $plus$plus(Map<KK, VV> map)
{
HashMap<K, V> copy = this.copy();
map.$plus$plus$eq(map);
return copy;
}

关于java - 双通配符通用类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29806912/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com