【发布时间】:2013-05-04 19:08:36
【问题描述】:
以下代码给出编译错误,错误为“重复方法”
static int test(int i){
return 1;
}
static String test(int i){
return "abc";
}
这是预期的,因为两个重载方法具有相同的签名并且仅在返回类型上有所不同。
但以下代码编译正常,但会出现警告:
static int test1(List<Integer> l){
return 1;
}
static String test1(List<String> l){
return "abc";
}
因为,我们知道 Java 泛型适用于 Erasure,这意味着在字节码中,这两种方法具有完全相同的签名并且返回类型不同。
此外,令我惊讶的是,以下代码再次出现编译错误:
static int test1(List<Integer> l){
return 1;
}
static String test1(List l){
return "abc";
}
第二个代码如何在没有任何编译错误的情况下正常工作,尽管有重复的方法?
【问题讨论】:
-
那是因为
List list和List<Integer> list是同一个接口,你可能想read aboutList<E>。 -
@AzadOmer:在运行时因为擦除所有列表都是相同的。所以,即使是第二个也应该给出编译错误,除非它是设计时特性。
-
您也可以阅读这个问题,实际上您的问题可能重复Click Here
-
@AzadOmer:根据您提供的链接,即使代码 sn-p 2 也不应该编译,因为在运行时它们是具有相同签名但返回类型不同的方法。
标签: java generics overloading type-erasure erasure