有没有办法将 return 当前 class 键入最终方法?
Is there a way to return current class type in a final method?
我在java中有以下情况;有一个 class 实现了一个最终方法,但我需要这种方法的 returning 类型与它调用它的 class 类型完全相同。因为我希望方法是最终的,所以我不能修改 subclasses 中的 return 数据类型,因为那是非法的。
有没有一种方法可以在不牺牲最终性并且必须为所有实现它的子class重写这种方法的情况下将其存档?。即使该方法不是最终的,以这种方式实现它仍然会更快。
代码应该是这样的:
class Parent
{
public currentClass finalMethod() {...}
}
class Children extends Parent {}
public static void main(String args[])
{
Children c = new Children();
System.out.print(c.finalMethod().getClass().getName()); // Would print Children
}
尝试使用反射和泛型无济于事。示例:
class Parent
{
public this.getClass() finalMethod() {...} //Many Errors
public <extends Parent> finalMethod() {...} // Returns Parent even if called by Child
public Class<? extends Parent>[] getVecinos() // Returns Class<? extends Parent> thus can't use polymorphism which is the use case
}
我知道我可以使用转换,但仍然不是最佳解决方案。
默认行为是您将获得所需的内容,只要finalMethod
不使用其他类型生成新实例。
要使用您的代码:
class Parent {
public final Parent finalMethod() {
return this;
}
}
这样,c.finalMethod().getClass().getName()
returns Children
。这是因为 finalMethod()
中的 this
是使用 new Children()
创建的同一对象,并且 getClass()
return 是对象的运行时 class。
它使用继承,只要您可以使用 Parent
作为 return 类型,就应该没问题。但是,如果您的 objective 是在 finalMethod()
的 return 值上调用特定于 Children
的方法,您可能需要使 Parent
通用。像这样:
class Parent<C extends Parent<C>> {
public final Parent<C> finalMethod() {
//whatever
return this;
}
}
class Children extends Parent<Children> {
}
这将使以下代码有效,仍然产生相同的输出:
Parent<Children> c = new Children(); //or Children c = new Children();
System.out.print(c.finalMethod().getClass().getName());
这样做的好处是您可以静态引用 Child
特定的方法,而无需事先强制转换。但这不是正确的解决方案,除非可以使 Parent
通用。它也不是 fail-safe.
我在java中有以下情况;有一个 class 实现了一个最终方法,但我需要这种方法的 returning 类型与它调用它的 class 类型完全相同。因为我希望方法是最终的,所以我不能修改 subclasses 中的 return 数据类型,因为那是非法的。
有没有一种方法可以在不牺牲最终性并且必须为所有实现它的子class重写这种方法的情况下将其存档?。即使该方法不是最终的,以这种方式实现它仍然会更快。
代码应该是这样的:
class Parent
{
public currentClass finalMethod() {...}
}
class Children extends Parent {}
public static void main(String args[])
{
Children c = new Children();
System.out.print(c.finalMethod().getClass().getName()); // Would print Children
}
尝试使用反射和泛型无济于事。示例:
class Parent
{
public this.getClass() finalMethod() {...} //Many Errors
public <extends Parent> finalMethod() {...} // Returns Parent even if called by Child
public Class<? extends Parent>[] getVecinos() // Returns Class<? extends Parent> thus can't use polymorphism which is the use case
}
我知道我可以使用转换,但仍然不是最佳解决方案。
默认行为是您将获得所需的内容,只要finalMethod
不使用其他类型生成新实例。
要使用您的代码:
class Parent {
public final Parent finalMethod() {
return this;
}
}
这样,c.finalMethod().getClass().getName()
returns Children
。这是因为 finalMethod()
中的 this
是使用 new Children()
创建的同一对象,并且 getClass()
return 是对象的运行时 class。
它使用继承,只要您可以使用 Parent
作为 return 类型,就应该没问题。但是,如果您的 objective 是在 finalMethod()
的 return 值上调用特定于 Children
的方法,您可能需要使 Parent
通用。像这样:
class Parent<C extends Parent<C>> {
public final Parent<C> finalMethod() {
//whatever
return this;
}
}
class Children extends Parent<Children> {
}
这将使以下代码有效,仍然产生相同的输出:
Parent<Children> c = new Children(); //or Children c = new Children();
System.out.print(c.finalMethod().getClass().getName());
这样做的好处是您可以静态引用 Child
特定的方法,而无需事先强制转换。但这不是正确的解决方案,除非可以使 Parent
通用。它也不是 fail-safe.