gpt4 book ai didi

java - 为什么要将变量声明为通配符类型

转载 作者:搜寻专家 更新时间:2023-11-01 02:04:00 24 4
gpt4 key购买 nike

Java tutorials ,有时会这样写:

Set<?> unknownSet = new HashSet<String>();

虽然我了解在类定义和方法中使用类型参数和通配符的好处,但我想知道以下问题:

  • 为变量指定一个包含通配符的类型有什么好处?
  • 在现实生活中,人们会这样做吗?何时会这样做?

最佳答案

通配符只在方法参数声明中真正有用,因为它们增加了可接受的参数类型的范围,例如:

void original(List<Number> list) { /* ... */ }
void withUpperWildcard(List<? extends Number> list) { /* ... */ }
void withLowerWildcard(List<? super Number> list) { /* ... */ }

original(new ArrayList<Number>()); // OK.
original(new ArrayList<Integer>()); // Compiler-error.
original(new ArrayList<Object>()); // Compiler-error.

withUpperWildcard(new ArrayList<Number>()); // OK.
withUpperWildcard(new ArrayList<Integer>()); // OK.

withLowerWildcard(new ArrayList<Number>()); // OK.
withLowerWildcard(new ArrayList<Object>()); // OK.

返回类型中的通配符让你的类的用户生活困难(或者更确切地说,困惑),因为你必须传播它们,或者做明确的工作让它们消失,例如:

List<? extends Number> method() { /* ... */ }

// Compiler error.
List<Number> list1 = method();
// OK, but yuk!
List<? extends Number> list2 = method();
// OK, but the list gets copied.
List<Number> list3 = new ArrayList<Number>(method());

局部变量中的通配符不是必需的(除了接受通配符返回方法的结果)。

引用《Effective Java 2nd Ed》:

If the user of a class has to think about wildcard types, there is probably something wrong with the class’s API.

关于java - 为什么要将变量声明为通配符类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38876810/

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