在Java 8中是否可以使用方法引用定义/实现方法?

时间:2017-09-21 07:52:33

标签: java class methods definition method-reference

有没有办法通过方法引用定义方法,如下面的虚构代码(和虚构语法)所示?

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;
}

类似的功能对我来说似乎非常有用。方法在编译时是已知的,因此类BC中的任何定义可能只是(在类型检查之后)接管对A中已知方法的引用。优点:更快的调用(即使在新方法的直接调用中也需要更少的调用) - 我不确定Java编译器是否不进行优化?

有没有办法在Java中实现这一点(如果是这样,它已经成功避开了我的搜索)?或者有没有充分的理由不将它引入Java?有没有提供类似性能优势的解决方法?

PS:我收到的消息是,类似的问题标题已被低估和/或关闭。如果这也适用于此,请帮助我理解原因。提前谢谢!

2 个答案:

答案 0 :(得分:2)

这个问题可分为两个不同的问题。

  1. 如何使用其他类的A类方法
  2. 如何在运行时指定方法的返回类型
  3. 关于第一个,请看一下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);
    }
}

但是我没有看到任何重点,重新设计设计,性能或任何其他方面。