我在实现这个抽象方法时遇到错误。我的目标是能够将参数设置为实现接口DataOutput
的任何类,例如DataOutputStream
。
抽象类中的抽象方法:
public abstract void writeMethods(DataOutput o) throws IOException;
在扩展类中实现抽象方法:
public void writeMethods(DataOutputStream d) throws IOException {}
答案 0 :(得分:2)
你做不到。如果抽象方法具有类型DataOutput
的参数,则不能使用类型为DataOutputStream
的参数的方法覆盖它。返回类型可以更具体,但不是参数。
您可以使用泛型来做类似的事情。
public abstract class MyAbstractClass<T extends DataOutput> {
public abstract void writeMethods(T t);
}
public class MyClass extends MyAbstractClass<DataOutputStream> {
@Override
public void writeMethods(DataOutputStream d) { ... }
}
答案 1 :(得分:2)
你实际上不能。 通过签名,您必须使用相同的类类型
实现该方法如果你想要一个更具体的方法,你可以创建另一个接受DataOutputStream的方法,并通过抽象方法的实现来调用:
public void writeMethods(DataOutputStream d) throws IOException {
//do something
}
@Override
public void writeMethods(DataOutput d) throws IOException {
if(d instanceof DataOutputStream)
writeMethods((DataOutputStream) d)
else
.... // something else
}
}
答案 2 :(得分:1)
方法定义
public void writeMethods(DataOutputStream d) throws IOException
与
不同public abstract void writeMethods(DataOutput o) throws IOException
DataOutputStream
和DataOutput
不同。在您的具体方法中,DataOutput
可以是DataOutputStream
的实例,但您不能在方法签名中以这种方式声明它。