gpt4 book ai didi

java - 类型删除如何在 Java 中用于通配符?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:22 25 4
gpt4 key购买 nike

如 javadoc 中所述,

Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.

Insert type casts if necessary to preserve type safety.

我理解使用 javac 处理的以上两点对于像 T 这样的类型参数和 <K, V> .

但对于以下方法中的通配符,

public static void printList(List<?> list) {
for (Object elem: list)
System.out.print(elem + " ");
System.out.println();
}

public void sumOfNumbers(List<? extends Number> numbers){
double d = 0.0;
for(Number n: numbers){
d += n.doubleValue();
}
System.out.println(d);
}

如果出现通配符,

1)

如何javac处理这些通配符?它会用什么东西代替吗?

2)

如何进行类型转换?

最佳答案

? 被替换为 Object(因为它没有边界)——没那么有用。
在构建时,编译器将检查您是否仅调用对象的行为。

? extends Number 替换为其绑定(bind)的 Number
在构建时,编译器将检查您是否仅将 Number 或其任何子类型作为参数传递。

类型转换 - 没有类型转换。在构建时,编译器将检查您是否仅调用了 Number 允许的行为。

T 替换为您为类的类型参数提供的任何类型。
在构建时,编译器将检查您是否只传递类型 T 作为参数(使用 T 作为方法中的参数)。

?T 有不同的用途。
T 视为通用类型(类、接口(interface))的创建 - 然后可以在类型中的任何地方引用它。

? 视为一种限制您可以在编译时合法调用方法的类型的方法。

关于java - 类型删除如何在 Java 中用于通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31583697/

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