gpt4 book ai didi

java - 我应该始终使用通配符作为函数参数的泛型类型还是仅传递一种泛型类型的实例?

转载 作者:行者123 更新时间:2023-11-30 03:40:55 25 4
gpt4 key购买 nike

考虑以下无效的 Java 代码:

class Example {
private static class Base {}
private static class Child extends Base{
public void do(){}
}

public void foo(List<Base>) {}

public static void main(String[] args) {
List<Child> list = new ArrayList<>();
fillListInPlaceWithChildren(list);

foo(list); //compile error, List<Child> does not extend List<Base>

list.stream().forEach(Child::do);
}
}

这不会编译,因为 List<Child>不是 List<Base> 的子类因此不能传递给 foo 函数。据我所知,为了解决此类问题,我有两种选择:

  1. 让 foo 接受 List<? extends Base> :

    class Example {
    private static class Base {}
    private static class Child extends Base{
    public void do(){}
    }

    public void foo(List<? extends Base>) {}

    public static void main(String[] args) {
    List<Child> list = new ArrayList<>();
    fillListInPlaceWithChildren(list);

    foo(list);
    list.stream().forEach(Child::do);
    }
    }
  2. listList<Base>并将元素强制转换为 Child 的实例当需要时

    class Example {
    private static class Base {}
    private static class Child extends Base{
    public void do(){}
    }

    public void foo(List<Base>) {}

    public static void main(String[] args) {
    List<Base> list = new ArrayList<>();
    fillListInPlaceWithChildren(list);

    foo(list);
    list.stream().forEach((item) -> ((Child)item).do());
    }
    }

哪个选项被认为是最佳实践?为什么?或者它们都有不同的用例?

最佳答案

您无法通过 List<Child>需要 List<Base> 的方法因为它可能会导致一些问题。在这种情况下,如果您传递 List<Child> 会发生什么? ?

void foo(List<Base> list) {
list.add(new Base());
}

如果您不依赖仅包含 Base 实例的列表。使用List<? extends Base>比在代码中添加类型转换更安全,而且它不会让阅读代码的人感到意外。

关于java - 我应该始终使用通配符作为函数参数的泛型类型还是仅传递一种泛型类型的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26846354/

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