【问题标题】:How to pass a non static method from a specific class as parameter to Function如何将特定类中的非静态方法作为参数传递给函数
【发布时间】:2021-05-02 13:56:39
【问题描述】:

这在 C++ 中是等价的,我想传递非静态函数和 Foo 的唯一方法:

class Foo
{
public:
  double method1 ()
  {
    return 1.0;
  }
  unsigned char method2 ()
  {
    return 2;
  }
};

template <typename T> 
T myMethod (T (*methodFromFoo) (void))
{
  return methodFromFoo ();
}

myMethod 的返回类型必须是通用的,因为我想要包装不同返回类型的方法。 java 11 中的语法是什么?

【问题讨论】:

    标签: java methods parameters


    【解决方案1】:

    根据方法的类型而有所不同。您需要阅读 Java 中的 Lambda's, Method references, and Functional Interfaces

    在您的示例中,供应商可以工作。

    import java.util.function.Supplier;
    
    public class PassingMethods {
        
        public static void main(String[] args) {
         PassingMethods pm= new PassingMethods();
         Foo foo = new Foo();
         pm.getVal(foo::method1);
         pm.getVal(foo::method2);
        }
        
        
        public <T> void getVal(Supplier<T> sup) {
            System.out.println(sup.get());
        }
        static class Foo
        {
        
          double method1 ()
          {
            return 1.0;
          }
          char method2 ()
          {
            return 'a';
          }
        }
    }
    

    打印

    1.0
    a
    

    我将 char 返回更改为返回 'a'。

    【讨论】:

      【解决方案2】:

      这在 java 中由函数式接口处理。由于您的方法不带参数并返回一个值,因此等效的 java 语法是 Supplier&lt;T&gt;

      所以,结果方法是:

      public <T> static T myMethod(final Supplier<T> supplier) {
          return supplier.get();
      }
      

      并通过传入适当的Supplier&lt;T&gt; 来调用它。 例如:

      public void invokeWithInlineLambda() {
          final int result = myMethod(() -> 10); // result = 10
      }
      
      public void invokeFromMethod() {
          final String result = myMethod(this::getResult); // result = "Meow"
      }
      
      
      private String getResult() {
          return "Meow";
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-18
        • 1970-01-01
        • 2021-05-19
        • 2013-05-03
        • 2019-03-14
        • 2021-04-23
        • 2020-04-20
        • 2016-03-17
        • 2018-11-16
        相关资源
        最近更新 更多