java:传递一个对象并返回相同对象的类型

时间:2016-01-10 11:31:14

标签: java design-patterns reflection abstract-class

我有一个抽象类A

public astract class A{
   public abstract A f(A a) throws IllegalArgumentException;
};

但我希望传递给f的对象具有相同类型的对象本身并返回相同类型的对象,否则抛出IllegalArgumentException。如何为所有子类实现一次?有没有办法在A级上做到这一点?

2 个答案:

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