泛型中的方法冲突
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"); } }

浙公网安备 33010602011771号