使用泛型作为Java的方法参数
我有一个界面:使用泛型作为Java的方法参数,java,generics,interface,overriding,abstract-class,Java,Generics,Interface,Overriding,Abstract Class,我有一个界面: public interface DDLOperation <T extends Artifact> { public void alter(T artifact); public void create(T artifact); public void drop(T artifact); } public abstract class AbstractDDLOperation <T extends Artif
public interface DDLOperation <T extends Artifact> {
public void alter(T artifact);
public void create(T artifact);
public void drop(T artifact);
}
public abstract class AbstractDDLOperation <T extends Artifact> implements DDLOperation {
@Override
public abstract void alter(T artifact);
@Override
public abstract void create(T artifact);
@Override
public abstract void drop(T artifact);
public void processChildElement(Element childElement) {
Artifact artifact = createArtifact(childElement);
alter(artifact);
}
}
我还有一个实现该接口的抽象类:
public interface DDLOperation <T extends Artifact> {
public void alter(T artifact);
public void create(T artifact);
public void drop(T artifact);
}
public abstract class AbstractDDLOperation <T extends Artifact> implements DDLOperation {
@Override
public abstract void alter(T artifact);
@Override
public abstract void create(T artifact);
@Override
public abstract void drop(T artifact);
public void processChildElement(Element childElement) {
Artifact artifact = createArtifact(childElement);
alter(artifact);
}
}
Eclipse在AbstractDDLOperation类中给出了这个错误:AbstractDDLOperation类型的方法alterT必须重写或实现一个超类型方法
我希望实现AbstractDDL操作的所有子类都传递不同类型的参数,所有这些参数都从工件类扩展到方法alter、create和drop
有人能就这个问题提出建议吗
谢谢。您的类应该实现DDL操作,而不是原始DDL操作 应该是:
public abstract class AbstractDDLOperation <T extends Artifact> implements DDLOperation<T>
否则,抽象类的方法不会重写或实现任何超级类型接口方法,因此@override注释不正确。您的类应该实现DDL操作,而不是原始DDL操作 应该是:
public abstract class AbstractDDLOperation <T extends Artifact> implements DDLOperation<T>
否则,抽象类的方法不会重写或实现任何超级类型接口方法,因此@override注释是不正确的。感谢它解决了这个问题,但我还有另一个问题:当我在抽象类中调用alterartifact时,它给出了另一个错误:类型AbstractDDL操作中的方法Alter不适用于arguments工件。对此有什么建议吗?@TuncerTunçer请编辑您的问题,将导致此错误的代码包括在内。这是因为您将接口定义为只接受实现工件的T,而不接受任何实现工件的类Artifact@TuncerT. alter接受T类型的参数,而不是任何工件。如果您使用新的ConcreteDDL操作实例化了您的类或抽象类的某个具体子类,那么您将只能传递一些工件实例以进行更改。如果可能的话,也许您的createArtifactchildElement方法应该更改为返回T。@GonenI工件只是其他类型工件的一个超类,如索引、表等。因此,如果我理解正确,您会说,方法alterartifact的参数应该是子类,而不是超类。如果我将参数强制转换为工件会发生什么?谢谢,它解决了问题,但我有另一个问题:当我在抽象类中调用alterartifact时,它会给出另一个错误:类型AbstractDDL操作中的方法alterT不适用于参数工件。对此有什么建议吗?@TuncerTunçer请编辑您的问题,将导致此错误的代码包括在内。这是因为您将接口定义为只接受实现工件的T,而不接受任何实现工件的类Artifact@TuncerT. alter接受T类型的参数,而不是任何工件。如果您使用新的ConcreteDDL操作实例化了您的类或抽象类的某个具体子类,那么您将只能传递一些工件实例以进行更改。如果可能的话,也许您的createArtifactchildElement方法应该更改为返回T。@GonenI工件只是其他类型工件的一个超类,如索引、表等。因此,如果我理解正确,您会说,方法alterartifact的参数应该是子类,而不是超类。如果我将参数转换为Artifact,会发生什么?