自类型 - 要求类型绑定中的类型
我想知道是否有可能限制在接口上声明的方法,以要求在类型绑定内键入类型。实际上,我想提供一种方法来强制转换一种类型,该类型在某种程度上是类型的,因为无法提供真正的类型安全性。
例如,考虑一个具有基类型的层次结构,该层次结构通过中间接口继承。通常,人们知道接口的类型,但不知道实现它的特定类。我想要一个方法,允许强制转换为接口的任一实现,而不允许强制转换为其他实现,如以下示例所示:Base
FirstInterface
Base
interface Base<TYPE extends Base<TYPE>> {
default <CAST extends TYPE> CAST as(Class<? extends CAST> type) {
if (type.isInstance(this)) {
return type.cast(this);
} else {
throw new IllegalArgumentException();
}
}
}
interface FirstIface<TYPE extends FirstIface<TYPE>> extends Base<TYPE> { }
class FirstClassA implements FirstIface<FirstClassA> { }
class FirstClassB implements FirstIface<FirstClassB> { }
interface SecondIface<TYPE extends SecondIface<TYPE>> extends Base<TYPE> { }
class SecondClassA implements SecondIface<SecondClassA> { }
class SecondClassB implements SecondIface<SecondClassB> { }
interface ThirdIface<TYPE extends ThirdIface<TYPE>> extends FirstIface<TYPE>, SecondIface<TYPE> { }
class ThirdClassA implements ThirdIface<ThirdClassA> { }
class ThirdClassB implements ThirdIface<ThirdClassB> { }
我希望能够用Java编译以下代码:
FirstIface<?> i = new FirstClassA();
FirstClassA a = i.as(FirstClassA.class); // desired: compiles, now: compiler error
FirstClassB b = i.as(FirstClassB.class); // desired: runtime exception, now: compiler error
这同样适用于 的层次结构,而以下代码应呈现编译器错误:ThirdIFace
SecondIface<?> i = new SecondClassA();
SecondClassA a = i.as(SecondClassA.class); // now and desired: compiler error
SecondClassB b = i.as(SecondClassB.class); // now and desired: compiler error
有没有办法声明不执行此要求?代码是自动生成的,因此也可以在自动生成的接口中提供重写(类也是如此)。使用覆盖时,会出现 .Base.as
SecondIface extends FirstIface