gpt4 book ai didi

java - 类型删除 Java 中的意外行为

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

根据关于 Type Erasure 的 Java 文档和 Bounded Type Parameters ,我知道在下面的代码示例中,doStuff() 的两个版本将具有相同的删除,因此不会编译。我的目标是重载 doStuff() 以接收 ClassOneClassTwo 的集合。

import java.util.List;

class Example {
class ClassOne {
}

class ClassTwo {
}

public void doStuff(List<ClassOne> collection) {
}

public void doStuff(List<ClassTwo> collection) {
}
}

类型删除机制包括以下步骤:

· 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.

因此,我应该能够应用一个边界然后它会编译,因为现在 doStuff 的类型删除版本被两个不同的签名(声明的上限)重载。示例:

class Example {
class ClassOne {
}

class ClassTwo {
}

public <U extends ClassOne> void doStuff(List<U> collection) {
}

public <U extends ClassTwo> void doStuff(List<U> collection) {
}
}

第二个示例实际上没有编译并给出以下错误:

Error:(15, 36) java: name clash: doStuff(java.util.List) and doStuff(java.util.List) have the same erasure

谁能给我解释一下?

最佳答案

问题是 List<U>将减少到只有 List在你的两种方法中。 (您不能在删除后留下 List<ClassOne>List<Object>。)

你引用的这段话意味着可以有以下声明:

class Example {
class ClassOne {
}

class ClassTwo {
}

public <U extends ClassOne> void doStuff(U foo) {
}

public <U extends ClassTwo> void doStuff(U foo) {
}
}

此处通用参数将替换为 ClassOneClassTwo分别,效果很好。

关于java - 类型删除 Java 中的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31243562/

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