多个嵌套通配符 - 参数不适用

发布于 2024-09-18 02:01:21 字数 549 浏览 6 评论 0 原文

我已经大大简化了我的问题。它是这样读的。

我试图找出为什么以下代码无法编译:

 List<AnonType<AnonType<?>>> l = new ArrayList<AnonType<AnonType<?>>>();
 l.add( new AnonType<AnonType<String>>() );

where

public class AnonType<T> {
  T a;

  List<T> b;
}

编译器错误表明 add 不适用于给定的参数。 OTOH,以下仅包含 1 层嵌套通配符的代码可以完美编译:

List<AnonType<?>> l = new ArrayList<AnonType<?>>();
l.add( new AnonType<String>() );

I've heavily simplified my problem. Here's how it reads.

I'm trying to figure out why the following code does not compile:

 List<AnonType<AnonType<?>>> l = new ArrayList<AnonType<AnonType<?>>>();
 l.add( new AnonType<AnonType<String>>() );

where

public class AnonType<T> {
  T a;

  List<T> b;
}

The compiler error is saying that add is not applicable for the argument given. OTOH, the following code with only 1-level nested wildcard compiles perfectly:

List<AnonType<?>> l = new ArrayList<AnonType<?>>();
l.add( new AnonType<String>() );

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

音盲 2024-09-25 02:01:21

以下内容按预期编译:

    List<Set<? extends Set<?>>> list = new ArrayList<Set<? extends Set<?>>>();
    list.add(new HashSet<Set<String>>());
    list.add(new HashSet<Set<Integer>>());

问题是泛型是类型不变的。

考虑一个更简单的示例:

  • 假设存在从 AnimalDog 的强制转换(例如 Dog extends Animal)...
    • List 不是 List
  • 存在来自 List 的捕获转换?将 Animal> 扩展为 List

现在,此场景中会发生以下情况:

  • 假设存在从 SetSet 的捕获转换代码>设置<字符串>...
    • Set> 不是 Set>
  • 有一个捕获从 Set> 扩展为 Set>

因此,如果您想要一个 List,您可以在其中添加 < code>Set>、Set> 等,则 TNOT Set>,而是 Set>

相关问题

另请参阅

The following compiles as expected:

    List<Set<? extends Set<?>>> list = new ArrayList<Set<? extends Set<?>>>();
    list.add(new HashSet<Set<String>>());
    list.add(new HashSet<Set<Integer>>());

The problem is that generics is type invariant.

Consider the simpler example:

  • Given that there is a casting conversion from Animal to Dog (e.g. Dog extends Animal)...
    • A List<Animal> IS NOT a List<Dog>
  • There is a capture conversion from List<? extends Animal> to a List<Dog>

Now here's what happens in this scenario:

  • Given that there is a capture conversion from Set<?> to Set<String>...
    • A Set<Set<?>> IS NOT a Set<Set<String>>
  • There is a capture conversion from Set<? extends Set<?>> to Set<Set<String>>

So if you want a List<T> where you can add a Set<Set<String>>, Set<Set<Integer>>, etc, then T is NOT Set<Set<?>>, but rather Set<? extends Set<?>>.

Related questions

See also

终弃我 2024-09-25 02:01:21

它无法编译,因为语句的 Pair<,> 中的第二个参数的类型是 String 并且该类型可能不是该类型的“未知”类型被用在声明中。我认为如果将 ? 替换为 Object ,它就会编译。当然,您将失去编译时类型检查。

It doesn't compile because the type of the second argument in the Pair<,> of the statement is String and that type might not be the "unknown" type that was used in the declaration. I think it will compile if you replace the ? with Object. Of course, you will then lose compile-time type-checking.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文