java:传递一个对象和return相同的对象类型

java: pass an object and return same object's type

我有一个摘要class A

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

但我希望传递给 f 的对象 a 具有与对象本身相同的类型,并且 return 具有相同类型的对象,否则抛出 IllegalArgumentException。我怎样才能为所有 subclasses 实现一次?在 class A 级别有办法做到这一点吗?

Java 没有提供一种方式来声明此要求。但是,您可以按照 Template Method 设计模式在摘要级别 class 进行 run-time 检查:

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
}

上述代码通过为 A 的所有子class 提供共享功能,将f(A) 从抽象方法更改为 模板方法。在这种情况下,共享功能是参数检查,还有 return 类型检查。

这是您 class 的客户将要使用的方法。另一方面,抽象 class 的实现者将实现 fImpl 方法,它可以假设它的参数 A 是一个子 class 匹配他们自己的 class.

public abstract class A
{
    public A f(A a) throws IllegalArgumentException
    {
        if (!this.getClass().equals(a.getClass()))
        {
            throw new IllegalArgumentException();
        }
        return a;
    }
}