我有一个抽象类A
public astract class A{
public abstract A f(A a) throws IllegalArgumentException;
};
但我希望传递给f的对象具有相同类型的对象本身并返回相同类型的对象,否则抛出IllegalArgumentException。如何为所有子类实现一次?有没有办法在A级上做到这一点?
答案 0 :(得分:1)
Java没有提供以声明方式声明此要求的方法。但是,您可以按照Template Method设计模式在抽象类的级别进行运行时检查:
public abstract class A {
public final A f(A a) {
if (a.getClass() != this.getClass()) {
throw new IllegalArgumentException();
}
A res = fImpl(a);
if (res.getClass() != this.getClass()) {
throw new InvalidOperationException();
}
return res;
}
protected abstract A fImpl(A a); // Implementing classes put functionality here
}
上述代码通过为f(A)
的所有子类提供共享功能,将A
从抽象方法更改为模板方法。在这种情况下,共享功能是参数检查,还有返回类型检查。
这是您班级的客户将要使用的方法。另一方面,抽象类的实现者将实现fImpl
方法,该方法可以假设其参数A
是与其自己的类匹配的子类。
答案 1 :(得分:0)
public abstract class A
{
public A f(A a) throws IllegalArgumentException
{
if (!this.getClass().equals(a.getClass()))
{
throw new IllegalArgumentException();
}
return a;
}
}