【问题标题】:Java method with parameterized list type parameter具有参数化列表类型参数的 Java 方法
【发布时间】:2021-03-30 19:01:16
【问题描述】:

假设我们有两个类 Parent 和 Child:

public class Parent {
}

public class Child extends Parent {
}

我们有以下参数的方法:

public void foo(List<Parent> list) {
...
}

我的问题为什么遵循方法参数是非法的(案例 A)

List<Child> list = List.of(new Child());
foo(list); //compile error

但同时这种情况是有效的(情况B)

foo(List.of(new Child());

List.of() 有这样的签名static &lt;E&gt; List&lt;E&gt; of(E... elements),所以我希望 List.of(new Child()) 的类型为 List&lt;Child&gt; 并且因为 this wildcard rule(List&lt;Child&gt; 不扩展 List&lt;Parent&gt;) 我认为这两种情况都不能编译。

但是为什么案例 B 会编译?编译器看到,List.of(new Child()) 没有显式类型,并检查列表的每个项目是否可以转换为 Parent.class 并这样做以获得正确的类型?

【问题讨论】:

  • 只需这样做而不是案例 B: List plist = List.of(new Child());富(plist);走着瞧吧?与您的情况 B 相同-但明确。虽然您的案例 A 将列表的类型设置为 sth。不同的。顺便提一句。你没有一个函数,而是一个方法 foo。
  • 将您的方法签名更改为foo(List&lt;? extends Parent&gt; list) 以接受 Parent 的后代。
  • @juwil 和我想的一样,谢谢!

标签: java generics


【解决方案1】:

Java 泛型是不变的。 List&lt;Child&gt; 不是 List&lt;Parent&gt; 的子类型。

在第二种情况下,foo() 的参数需要List&lt;Parent&gt; 类型,这会强制将List.of() 推断为EParent(即List.&lt;Parent&gt;of(new Child()))。请注意,new Child() 可以传递给List.&lt;Parent&gt;of(),因为ChildParent 的子类型。

【讨论】:

    【解决方案2】:

    这应该可行:

    List<Parent> list = List.of(new Child());
    foo(list);
    

    您可以将子类型列表分配给声明为类型列表的变量。

    您不能将类型列表传递给声明为接受子类型列表的方法。

    【讨论】:

      猜你喜欢
      • 2019-09-09
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多