注册 登录
编程论坛 JAVA论坛

泛型重载

jsRank 发布于 2015-09-08 11:33, 616 次点击
例:
public class Main<T>{
    public boolean equals(T obj){
        return true;
    }
};
该泛型类会在编译时擦除,成为:
 public class Main{
    public boolean equals(Object obj){
        return true;
    }
};
擦除后的equals方法和Object.equals方法的一样,但是为什么不能重写呢,会报编译错误
9 回复
#2
林月儿2015-09-08 11:36
程序代码:
public class Main<T extends Object>{
    public boolean equals(T obj){
        return true;
    }
};
#3
jsRank2015-09-08 11:38
回复 2楼 林月儿
你试了吗,不好使,亲
#4
林月儿2015-09-08 11:42
回复 3楼 jsRank
Name clash: The method equals(T) of type Main<T> has the same erasure as equals(Object) of type Object but does not override it
额,确实不好使
#5
林月儿2015-09-08 11:43
程序代码:
public class Main<T extends Object>{
    int a;
    @Override
    public boolean equals(Object obj) {
        return true;
    }
   
};
#6
林月儿2015-09-08 11:46
回复 3楼 jsRank
无成员不好使。。。
#7
jsRank2015-09-08 12:10
回复 6楼 林月儿
跟成员没关系,你把成员删了照样好使。
你都把我原来的方法给改了,我是equals(T obj),你都给我改成equals(Object obj)了,我的问题是我那么写为什么不行,而不是应该怎么写
#8
林月儿2015-09-08 12:19
回复 7楼 jsRank
不知道诶
#9
calix2015-09-09 09:34
由于你的equals参数类型不相同,编译器根据方法签名(方法名+参数列表)判断认为是一个新方法
但是进行泛型擦除后出现了两个相同的equals方法,这块编译器就走不下去了

你打算用Main的实例跟T类型对象进行比较?
#10
jsRank2015-09-15 08:55
回复 9楼 calix
恩,编译器是先判断能否重载,然后才进行擦除。这个是有先后顺序的。
1