[英]Does something like a <getClass()> generic parameter exist in Java?
我想有一个抽象方法,该方法具有实例的确切类的参数。 例如:
abstract class Foo {
abstract void aFunc(???? newInst);
}
class Bar extends Foo {
@Override
void aFunc(Bar newInst);
}
class Baz extends Foo {
@Override
void aFunc(Baz newInst);
}
实际上,我希望能够访问所有子类字段和方法,而不必检查和强制转换newInst参数。 (因为该函数将从进行检查和转换的中央处理程序位置调用)。
我知道我可以通过用Foo<T extends Foo>
参数化Foo来做到这一点,但我希望避免在class Name extends Foo<Name>
情况下声明子class Name extends Foo<Name>
。
我怀疑是否有可能,而且我一直无法找到关于该主题的任何内容,但是我想确认没有什么我想念的。
元注释:
您想要拥有的东西确实打破了多态性:现在您无法在可以使用Foo
任何地方使用Bar
或Baz
因为它们具有不再兼容的aFunc标记。
但是,您可以做的是使用更具体的返回类型:
class Foo {
Foo aFunc();
}
class Bar extends Foo {
@Override
Bar aFunc();
}
已验证。 您可以使用Bar的实例代替Foo并调用其aFunc
方法; 那么您也可以将该方法的结果用作Foo的实例。 因此,从Java 1.5开始, JLS就允许使用协变返回类型 。
感谢所有评论帮助的人。
正确的方法是在class Bar extends Foo<Bar>
声明该类,为简单起见,我将Foo作为参数传递,并使所有子类自己强制转换参数(如果需要)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.