两个单独的泛型类型具有相同的擦除?

The*_*eLQ 4 java generics

我偶然发现了一个我从未见过的有趣错误,无法解释原因

考虑以下课程

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都有相同的参数类型 - 如果我正确读取该部分.