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");
}
}