作者sbrhsieh (偶尔想摆烂一下)
看板java
标题Re: [问题] 泛型的问题
时间Sat Oct 30 20:29:02 2010
※ 引述《newjoy (职业格斗家)》之铭言:
: // @ jdk 1.6
: public class GenericTest implements Comparable<String>{
: public int compareTo(Object o)
: {
: return 0;
: }
: public int compareTo(String s)
: {
: return 0;
: }
: public static void main(String[] args) {
: new GenericTest();
: }
: }
: //----
: Comparable的 source code的宣告是 Comparable<T t>
: 请问为什麽上面的public int compareTo(Object o)会发生
: GenericTest.java:1: name clash: compareTo(java.lang.Object) in GenericTest
: and compareTo(T) in java.lang.Comparable<java.lang.String> have the same
: erasure, yet neither overrides the other
: public class GenericTest implements Comparable<String>{
: 明明我有实作了compareTo(String s),
: 那在没加@Override的情况下compareTo(Object o)也只不过是一个无关的function而已吧?
Comparable<T> interface 实际上是定义了一个 abstract method(经过 erasure):
public abstract int compareTo(Object);
当你定义一个 concrete class(比如你的 GenericTest) implements
Comparable<String>,那麽你需要在 source code 里明确定义
public int compareTo(String s) {...}
编译器会将他视为 override Comparable<T>::compareTo(T) method。
细节上来说,编译器会为上述的
compareTo method 定义产生两个 method:
public int compareTo(String s) {...}
以及一个 synthetic bridge method:
public int compareTo(Object obj) {
return compareTo((String) obj);
}
(以 JVM spec. 层面来说,後者才是真正 override Comparable<T>::compareTo
method 的 method)
但是在 Java Programming Language level 来说,你不能自己明白定义
compareTo(Object) method。
Generics 引进 Java PL 之後,overriding 的定义稍微变复杂,细节部份请
参阅 Java Language Specification 3rd edition 的
8.4.2 Method Signature 与 8.4.8 内各节。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.24.82.107
※ 编辑: sbrhsieh 来自: 114.24.82.107 (10/30 20:41)
1F:→ tomap41017:generics的引进不管在什麽语言都是复杂化(叹) 10/30 21:26
2F:→ james732:不,在C++是妖魔化 XDDD 10/30 21:27
3F:→ TonyQ:对使用简单,对开发复杂。 10/30 21:34