首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个独立的泛型类型有相同的擦除吗?

两个独立的泛型类型有相同的擦除吗?
EN

Stack Overflow用户
提问于 2010-08-22 07:41:02
回答 4查看 4.2K关注 0票数 4

我偶然发现了一个我以前从未见过的有趣的错误,并且无法解释为什么

考虑下面的类

代码语言:javascript
复制
public class Sandbox<A,B> {
 public void put(B b) {
 }
 public void put(A a) {
 }
}

在我看来没问题。所以我编译了它,然后得到了这个

代码语言:javascript
复制
name clash: put(B) and put(A) have the same erasure

哈?两个不同的泛型如何拥有相同的签名?那是完全分开的!

我可能遗漏了一些非常基本的东西,但我以前从来没有遇到过这个问题。我已经通过调用putAputB方法修复了这个问题,但我真的很好奇为什么会发生这个错误。

有人能解释一下吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-22 07:57:07

从逻辑上讲,请考虑以下代码:

代码语言:javascript
复制
SandBox<String, String> sandBox = new SandBox<String, String>();
sandBox.put("foo"); // which put is invoked?

(尽管我应该承认,可以生成完全有效的代码来产生类似的情况-然后在“随机”中选择一种方法。)

从形式上讲,我认为this section of the JLS是相关的。两个版本的put都有相同的参数类型--如果我没看错的话。

票数 17
EN

Stack Overflow用户

发布于 2010-08-22 07:57:19

Java中的泛型仅在代码级可用,在运行时不可用。

因此,当编译器翻译你的源码时,你为A和B指定的类型就会被“擦除”。这意味着两种类型都设置为java.lang.Object

所以你最终得到了两个相同的方法签名。

票数 3
EN

Stack Overflow用户

发布于 2010-08-22 07:59:20

两个不同的泛型如何拥有相同的签名?那是完全分开的!

Java泛型是基于type erasure的。这意味着你的代码基本上是这样编译的:

代码语言:javascript
复制
public class Sandbox{
 public void put(Object b) {
 }
 public void put(Object a) {
 }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3539477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档