有没有办法通过方法引用定义方法,如下面的虚构代码(和虚构语法)所示?
class A
{
public Sometype somefunction(Argtype arg)
{ ... return somevalue; ..}
}
class B
{
public Sometype method = A::somefunction;
}
或
class C
{
public Sometype method(Argtype arg) = A::somefunction;
}
类似的功能对我来说似乎非常有用。方法在编译时是已知的,因此类B
或C
中的任何定义可能只是(在类型检查之后)接管对A
中已知方法的引用。优点:更快的调用(即使在新方法的直接调用中也需要更少的调用) - 我不确定Java编译器是否不进行优化?
有没有办法在Java中实现这一点(如果是这样,它已经成功避开了我的搜索)?或者有没有充分的理由不将它引入Java?有没有提供类似性能优势的解决方法?
PS:我收到的消息是,类似的问题标题已被低估和/或关闭。如果这也适用于此,请帮助我理解原因。提前谢谢!
答案 0 :(得分:2)
这个问题可分为两个不同的问题。
关于第一个,请看一下Java继承,多态,抽象类和接口。
我会将A类定义为抽象:
abstract class A{
public Sometype somefunction(Argtype arg)
{ ... return somevalue; ..}
}
和B,C扩展它:
class B extends A{
}
通过这种方式,B和C继承了A中实现的所有方法,您可以执行以下操作:
B b = new B();
b.somefunction(arg);
此外,如果您在编译时不知道此方法的返回类型,请参考第二个问题,您可以利用java泛型(如果多态性不够)。这样,A类就变成了:
abstract class A{
public T somefunction(Class<T> type)
{ ... return somevalue; ..}
}
,前面的示例代码变为:
B b = new B();
b.somefunction(String.class);
答案 1 :(得分:2)
你可以这样做:
class A {
public static Sometype someStaticFunction(Argtype aArg) {
...
}
public Sometype someNonStaticFunction(Argtype aArg) {
...
}
}
class B {
private Function<Argtype, Sometype> mStaticFunction = A::someStaticFunction;
private Function<Argtype, Sometype> mNonStaticFunction = new A()::someNonStaticFunction;
public Sometype applyStatic(Argtype aArg) {
return mStaticFunction.apply(aArg);
}
public Sometype applyNonStatic(Argtype aArg) {
return mNonStaticFunction.apply(aArg);
}
}
但是我没有看到任何重点,重新设计设计,性能或任何其他方面。