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;
}
}
我有一个摘要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;
}
}