如何声明一个接受任何类型 Function<> 的方法引用的变量

Posted

技术标签:

【中文标题】如何声明一个接受任何类型 Function<> 的方法引用的变量【英文标题】:How to declare a variable that accepts method reference of any type Function<> 【发布时间】:2021-08-30 12:34:35 【问题描述】:

我正在尝试声明一个接受任何类型的方法引用的变量Function

此方法引用将在映射器中使用,我接受一些输入并通过调用引用另一个对象的方法来映射相应的值。

@Data // Lombok
public class ReferenceSample<T, R> 

  private final Function<T, R > methodReference; // should be able to accept any method reference


以下是可能的方法

     public class Common 

          public static String getMethod1(String a) 
            // Process
            return "result1";
          

          public static SomeEnum getMethod2(String b) 
            // Process
            return SomeEnum.DATA;
          
        

当我尝试创建对象时

new ReferenceSample(Common::getMethod1);

我收到以下错误

java: incompatible types: invalid method reference
    incompatible types: java.lang.Object cannot be converted to java.lang.String

【问题讨论】:

查看 java.lang.reflect @ControlAltDel 你能详细说明你指的是什么吗? 这会有什么用?你会如何调用这个函数? docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html @ControlAltDel 我不确定我应该在这里用反射做什么。 【参考方案1】:

您需要专门化泛型类型,如下所示。

public class Reference

    public static void main (String[] args)
    
        Reference app = new Reference ();
        app.test ();
    

    private void test ()
    
        int[] row = 1, 1, 5, 2, 4;

        System.out.println ("Input: " + Arrays.toString (row));

        // This fails because the generic types have not been specified
        ReferenceSample rs1 = new ReferenceSample (Common::getMethod1);
        
        // This compiles but isn't specialized
        ReferenceSample<?, ?> rs2 = new ReferenceSample<> (Common::getMethod1);
        
        // This is preferred because it specifies the types precisely
        ReferenceSample<String, String> rs3 = new ReferenceSample<> (Common::getMethod1);
    


class ReferenceSample<T, R>

    public Function<T, R> methodReference; // should be able to accept any method reference

    public ReferenceSample (Function<T, R> methodReference)
    
        this.methodReference = methodReference;
    


class Common

    public static String getMethod1 (String a)
    
        // Process
        return "result1";
    

    public static String getMethod2 (String b)
    
        // Process
        return "+" + b + "+";
    

【讨论】:

以上是关于如何声明一个接受任何类型 Function<> 的方法引用的变量的主要内容,如果未能解决你的问题,请参考以下文章

从std :: function中推导返回和参数类型作为模板函数参数传递?

我如何编写一个接受整数并使用while循环返回前n个偶数之和的函数function(n)?

是否有可能使函数接受给定参数的多种数据类型?

如何声明一个接受 lambda 的函数?

function 类型(函数定义)----读书总结

如何在返回其回调之一结果的函数的 Typescript 中声明类型?