Emi*_*mil 4 java constructor type-erasure
我正在为一个类定义一个构造函数,我有这两个定义:
MyClass(Set<ClassA> setOfA) { ... }
MyClass(Set<ClassB> setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
MyClass(java.util.Set<ClassA>) is already defined in MyClass
MyClass(Set<ClassB> setOfB)
Run Code Online (Sandbox Code Playgroud)
如果我特意将其中一个设为HashSet而不是Set,则代码会编译.为什么?
如果你有
MyClass(Set<A> setOfA) { ... }
MyClass(Set<B> setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)
类型擦除将它们变成:
MyClass(Set setOfA) { ... }
MyClass(Set setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)
所以现在他们是一样的,编译器很困惑.
但是,如果其中一个是a HashSet,你最终得到这个:
MyClass(Set setOfA) { ... }
MyClass(HashSet setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)
现在,它们与编译器完全不同,以确定在编译时绑定哪个.
由于类型擦除,Java编译器将(根据Java文档):
- 将泛型类型中的所有类型参数替换为其边界,或者
Object如果类型参数是无界的...- 如有必要,插入类型铸件以保持类型安全.
- 生成桥接方法以保留扩展泛型类型中的多态性.
换句话说,Java编译器会将代码转换为:
MyClass(Set setOfA) { ... }
MyClass(Set setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)
所以两者都有相同的参数.这就是错误的原因.
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |