Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java8中,是否可以使用方法引用定义/实现方法?_Java_Class_Methods_Definition_Method Reference - Fatal编程技术网

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

在Java8中,是否可以使用方法引用定义/实现方法?,java,class,methods,definition,method-reference,Java,Class,Methods,Definition,Method Reference,是否有任何方法可以通过方法引用来定义方法,如下面的虚拟代码(和虚拟语法)所示 或 类似的功能对我来说似乎很有用。方法在编译时是已知的,因此类B或C中的任何定义可能只是(在类型检查后)取代了对a中已知方法的引用。优点:更快的调用(甚至比从新方法直接调用所需的调用更少)——我不确定Java编译器是否不会进行优化 有没有什么方法可以在Java中实现这一点(如果有,它成功地避开了我的搜索)?还是有充分的理由不将其引入Java?是否有提供类似性能优势的变通方法 PS:我得到的信息是,类似的问题标题已被否决

是否有任何方法可以通过方法引用来定义方法,如下面的虚拟代码(和虚拟语法)所示

类似的功能对我来说似乎很有用。方法在编译时是已知的,因此类
B
C
中的任何定义可能只是(在类型检查后)取代了对
a
中已知方法的引用。优点:更快的调用(甚至比从新方法直接调用所需的调用更少)——我不确定Java编译器是否不会进行优化

有没有什么方法可以在Java中实现这一点(如果有,它成功地避开了我的搜索)?还是有充分的理由不将其引入Java?是否有提供类似性能优势的变通方法


PS:我得到的信息是,类似的问题标题已被否决和/或关闭。如果这在这里也适用,请帮助我理解原因。提前谢谢

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

  • 如何使用其他类中的类A方法
  • 如何在运行时指定方法的返回类型
  • 关于第一个,我们来看一下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);
    
    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);
        }
    }
    
    此外,关于第二个问题,如果您在编译时不知道该方法的返回类型,您可以利用java泛型(如果多态性还不够)。这样,A级成为:

    abstract class A{
        public T somefunction(Class<T> type)
        { ... return somevalue; ..}
    }
    

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

  • 如何使用其他类中的类A方法
  • 如何在运行时指定方法的返回类型
  • 关于第一个,我们来看一下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);
    
    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);
        }
    }
    
    此外,关于第二个问题,如果您在编译时不知道该方法的返回类型,您可以利用java泛型(如果多态性还不够)。这样,A级成为:

    abstract class A{
        public T somefunction(Class<T> type)
        { ... return somevalue; ..}
    }
    

    你可以这样做:

    B b = new B();
    b.somefunction(arg);
    
    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);
        }
    }
    
    A类{
    公共静态Sometype someStaticFunction(Argtype aArg){
    ...
    }
    公共Sometype SomeNonStationFunction(Argtype aArg){
    ...
    }
    }
    B类{
    私有函数mStaticFunction=A::someStaticFunction;
    私有函数mNonStaticFunction=newA()::someNonStaticFunction;
    公共Sometype applyStatic(Argtype aArg){
    返回mStaticFunction.apply(aArg);
    }
    公共Sometype ApplyOnStatic(Argtype aArg){
    返回mNonStaticFunction.apply(aArg);
    }
    }
    

    然而,我不认为这有任何意义,重新升级设计、性能或任何其他方面。

    您可以这样做:

    B b = new B();
    b.somefunction(arg);
    
    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);
        }
    }
    
    A类{
    公共静态Sometype someStaticFunction(Argtype aArg){
    ...
    }
    公共Sometype SomeNonStationFunction(Argtype aArg){
    ...
    }
    }
    B类{
    私有函数mStaticFunction=A::someStaticFunction;
    私有函数mNonStaticFunction=newA()::someNonStaticFunction;
    公共Sometype applyStatic(Argtype aArg){
    返回mStaticFunction.apply(aArg);
    }
    公共Sometype ApplyOnStatic(Argtype aArg){
    返回mNonStaticFunction.apply(aArg);
    }
    }
    

    然而,我不认为这有任何意义,重新升级设计、性能或任何其他方面。

    使用decorator怎么样?您可以在类A中定义方法,并从类B或C中调用相同的方法。如果您可以共享您的确切用例。这将明确你的要求。你可能会得到更准确的答案绩效优势?这是关于微观优化的问题吗?
    Sometype
    somefunction
    的返回类型。类
    B
    C
    中的字段必须是
    函数类型
    或类似的类型。@Kayaman,更一般的:对我来说,类似的特性应该是方法引用存在的结果。我希望从答案中获得更多的见解。@dpr,如果使用lambda表达式,即函数接口和匿名类-是的。但我希望有一种简单而一致的方法,在定义时将方法引用分配给类方法,从而避免所有的开销。我的希望似乎没有实现,至少在Java8中是这样,未来的版本是否能够提供,或者是否有概念上的原因反对,这将是非常有趣的?您可以在类A中定义方法,并从类B或C中调用相同的方法。如果您可以共享您的确切用例。这将明确你的要求。你可能会得到更准确的答案绩效优势?这是关于微观优化的问题吗?
    Sometype
    somefunction
    的返回类型。类
    B
    C
    中的字段必须是
    函数类型
    或类似的类型。@Kayaman,更一般的:对我来说,类似的特性应该是方法引用存在的结果。我希望从答案中获得更多的见解。@dpr,如果使用lambda表达式,即函数接口和匿名类-是的。但我希望有一种简单而一致的方法,在定义时将方法引用分配给类方法,从而避免所有的开销。我的希望似乎没有实现,至少在Java 8中是这样,未来的版本是否能够提供,或者是否有概念上的理由反对,这将是非常有趣的。事实上,这没有意义,因为调用另一个方法很容易实现,只需调用它。但是