在抽象类中实现接口参数

时间:2015-10-04 18:11:51

标签: java

我在实现这个抽象方法时遇到错误。我的目标是能够将参数设置为实现接口DataOutput的任何类,例如DataOutputStream

抽象类中的抽象方法:

public abstract void writeMethods(DataOutput o) throws IOException;

在扩展类中实现抽象方法:

public void writeMethods(DataOutputStream d) throws IOException {}

3 个答案:

答案 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

DataOutputStreamDataOutput不同。在您的具体方法中,DataOutput可以是DataOutputStream的实例,但您不能在方法签名中以这种方式声明它。