我有一个方法,在名为"PlaceParser"的类中,extends"ModelParser":
protected Place parseModel(JSONObject element) ...
Run Code Online (Sandbox Code Playgroud)
Place是Model的子类.是否应将@Override注释添加到上面的代码中?由于该方法具有不同的返回类型,这仍然算作覆盖具有相同名称和参数的基类方法/返回类型是否改变了"签名"?
"ModelParser"方法看起来像"ModelT"也扩展了"Model":
protected abstract ModelT parseModel(JSONObject element)
throws JSONException;
Run Code Online (Sandbox Code Playgroud)
更新@Jon Skeet:
基类声明如下:
public abstract class ModelParser<ModelT extends Model> {
Run Code Online (Sandbox Code Playgroud)
我以前没见过类的<ModelT extends Model>样式声明.
我有两个接口:
interface S {
public String m1();
}
interface O {
public Object m1();
}
Run Code Online (Sandbox Code Playgroud)
我决定在类Test中实现O和S:
class Test implements O, S {
}
Run Code Online (Sandbox Code Playgroud)
我的问题 :
为什么我必须只实现方法public String m1()而不是其他方法?其次,为什么我不能实现public Object m1()而不是public String m1()?
我确实理解需要创建桥接方法,例如需要传递参数的 setter 方法,但是 getter 方法呢?为什么Java也产生桥接方法呢?
下面是 ChatGPT 生成的虚拟代码,以使事情更加具体:
class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
class StringBox extends Box<String> {
public void setValue(String value) {
System.out.println("Setting a String value in StringBox");
super.setValue(value.toString());
}
public String getValue() {
System.out.println("Getting String value from StringBox");
return super.getValue();
}
}
Run Code Online (Sandbox Code Playgroud)
擦除后的 Box 类将具有以下方法:
public Object getValue();
在 StringBox 类中,我们定义了该方法:
public String getValue()
但这两个方法具有相同的签名,并且重写方法的返回类型使用 String 作为返回类型,String 是 Object 的子类class(Covariant …
我找到了一个解释什么是协变返回类型?但我不明智地理解这一切.
我认为Covariant返回类型理论上是一个函数返回的类型,该函数具有与内置基类函数相同的签名,其返回类型不同.
class Base{
TypeX func( int i ){return typex;} // builtin function
};
class Derived:Base{
TypeY func(int i){return typey;}
}
Run Code Online (Sandbox Code Playgroud)
我对这种所谓的协变返回类型的理解是否正确?[这个词让我很困惑.]
java ×5
overriding ×3
annotations ×1
bridge ×1
c# ×1
generics ×1
inheritance ×1
methods ×1
overloading ×1