我偶然发现了一个我从未见过的有趣错误,无法解释原因
考虑以下课程
public class Sandbox<A,B> {
public void put(B b) {
}
public void put(A a) {
}
}
Run Code Online (Sandbox Code Playgroud)
看起来对我的眼睛好.所以我编译它然后得到它
name clash: put(B) and put(A) have the same erasure
Run Code Online (Sandbox Code Playgroud)
咦?两种不同的泛型类型如何具有相同的签名?完全分开!
我可能遗漏了一些完全基本的东西,但我之前没遇到过这个问题.我已经创可贴通过调用方法解决了这一问题putA
,并putB
,但我真的很好奇,为什么首先发生这个错误.
有人会介意解释吗?
wax*_*ing 17
从逻辑上讲,请考虑以下代码:
SandBox<String, String> sandBox = new SandBox<String, String>();
sandBox.put("foo"); // which put is invoked?
Run Code Online (Sandbox Code Playgroud)
(虽然我应该承认,可以生成产生类似情况的完全有效的代码 - 然后选择"随机"方法.)
在形式上,我认为JLS的这一部分是相关的.两个版本的put都有相同的参数类型 - 如果我正确读取该部分.
归档时间: |
|
查看次数: |
4172 次 |
最近记录: |