gpt4 book ai didi

java - Java 编译器如何处理多个泛型边界?

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:57 24 4
gpt4 key购买 nike

看看这个(可以说是愚蠢的)代码:

public <T extends Appendable & Closeable> void doStuff(T object)
throws IOException{

object.append("hey there");
object.close();

}

我知道编译器会删除通用信息,所以我对 Java 1.4 代码与编译器所做的等效代码很感兴趣(我很确定编译器不会重新排列源代码,所以我要求等效的代码像我这样天真的人都能看懂的Java源码版本)

是这样的:

public void doStuff(Object object)
throws IOException{

((Appendable)object).append("hey there");
((Closeable)object).close();

}

或者像这样:

public void doStuff(Object object)
throws IOException{
Appendable appendable = (Appendable) object;
Closeable closeable = (Closeable) object;

appendable.append("hey there");
closeable.close();

}

或者甚至像这样:

public void doStuff(Appendable appendable)
throws IOException{
Closeable closeable = (Closeable) appendable;

appendable.append("hey there");
closeable.close();

}

还是另一个版本?

最佳答案

方法的签名看起来像public void doStuff(Appendable appendable),因为

The order of types in a bound is only significant in that the erasure of a type variable is determined by the first type in its bound, and that a class type or type variable may only appear in the first position.

( JLS §4.4 Type Variables )

如果您使用反射访问此方法,此行为可能很重要。

此行为的另一个用途是保留与前通用接口(interface)的二进制兼容性,如 Generics Tutorial 中所述。 ,第 10 节(感谢 Mark Peters 指出)。也就是说,

public static <T extends Object & Comparable<? super T>> T max(Collection<T> coll)

与其返回 Object 的前通用版本二进制兼容。


方法主体等同于以下内容,但我认为它是实现细节:

appendable.append("hey there"); 
((Closeable) appendable).close();

关于java - Java 编译器如何处理多个泛型边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4258447/

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