泛型中的方法冲突

class LastError<T> {
    private T lastError;
    
    public void setError(T t){
        lastError = t;
        System.out.println("LastError: setError");
    }
}

class StrLastError<S extends CharSequence> extends LastError<String>{
    public StrLastError(S s) {}

    public void setError(S s){
        System.out.println("StrLastError: setError");
    }
}

class Test {
    public static void main(String[] args) {
        StrLastError<String> err = new StrLastError<String>("Error");
        err.setError("Last error");
    }
}

这段代码报错, 原因是:StrLastError.setError(S) 没有形成重载。
因为StrLastError里面有2个方法,
setError(java.lang.CharSequence)
setError(java.lang.Object)
对于err.setError(“last error”) 都是模糊的,故报错。

但如果把<S extends CharSequence>去掉,即可成功。

即把代码改为

class LastError<T> {
    private T lastError;

    public void setError(T t){
        lastError = t;
        System.out.println("LastError: setError");
    }
}

class StrLastError extends LastError<String>{
    public StrLastError(String s) {}

    public void setError(String s){
        System.out.println("StrLastError: setError");
    }
}

public class Test {
    public static void main(String[] args) {
        StrLastError err = new StrLastError("Error");
        err.setError("Last error");
    }
}

StrLastError不再是泛型。虚拟机生成桥方法如下:

class StrLastError extends LastError<java.lang.String> {
  public StrLastError(java.lang.String);
  public void setError(java.lang.String);
  public void setError(java.lang.Object);//里面实质调用上面那个方法
}

就是说,如果StrLastError还是泛型类的话,有两个方法对于setError(String)都是可以满足的,就冲突了。

若把LastError改为T extends Number, 然后StrlastError改为继承LastError<Integer>也是可以的。

public class Test {
    public static void main(String[] args) {
        StrLastError err = new StrLastError("Error");
        err.setError("Last error");
    }
}

class LastError<T extends Number> {
    private T lastError;

    public void setError(T t){
        lastError = t;
        System.out.println("LastError: setError");
    }
}

class StrLastError<S extends CharSequence> extends LastError<Integer>{
    public StrLastError(S s) {}

    public void setError(S s){
        System.out.println("StrLastError: setError");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值