Java Lambda方法参考-要求清晰

Java Lambda方法参考-要求清晰,java,generics,lambda,compiler-errors,Java,Generics,Lambda,Compiler Errors,传递lambda方法引用时出错,类型不兼容。 在调用函数接口方法时,代码可以很好地编译并替换具体对象。当传递方法引用时,抛出类型不兼容。请澄清我的误解 public interface ParsingFileFunction { public <K,T> K getMessage(T inputMessage); } public class FileUtility { public static Messages readMessage(File kingMesa

传递lambda方法引用时出错,类型不兼容。 在调用函数接口方法时,代码可以很好地编译并替换具体对象。当传递方法引用时,抛出类型不兼容。请澄清我的误解

public interface ParsingFileFunction {
    public <K,T> K getMessage(T inputMessage);
}

public class FileUtility {
    public static Messages readMessage(File kingMesaages){
        //some process here
        return messages; //of Messages type
    }
}
public class SomeController{
    @Autowired
    SomeService someService;
    public void parse(File kingMessage) {
        //compiler error -- The type FileUtility does not define readMessage(T) that is applicable here
        Messages kingdomMessages = someService.getMessage(FileUtility::readMessage,kingMessage);
    }
}

@Service
public class SomeService{
    public Messages getMessage(ParsingFileFunction parse,File file) {
        //this compiles perfectly fine as expected
        return parse.getMessage(file); 
    }
}
公共接口ParsingFileFunction{
公共K getMessage(T inputMessage);
}
公共类文件实用程序{
公共静态消息readMessage(文件){
//这里有一些过程
返回消息;//消息类型的
}
}
公共类控制器{
@自动连线
一些服务一些服务;
公共void解析(文件消息){
//编译器错误--FileUtility类型未定义此处适用的readMessage(T)
Messages kingdomMessages=someService.getMessage(FileUtility::readMessage,kingMessage);
}
}
@服务
公共类服务{
公共消息getMessage(ParsingFileFunction解析,文件文件){
//这编译得非常好,正如预期的那样
返回parse.getMessage(文件);
}
}

Java无法检查正确的类型,因为它们不是接口定义的一部分,而是方法定义的一部分。它通过以下调整工作:

ParsingFileFunction.java
公共接口ParsingFileFunction{
K getMessage(T inputMessage);
}
请注意,类型已移动到接口定义中

SomeService.java
import org.springframework.stereotype.Service;
导入java.io.File;
@服务
公共类服务{
公共消息getMessage(ParsingFileFunction解析,文件文件){
返回parse.getMessage(文件);
}
}

注意
文件

声明中的显式类型。如果这样做,是否必须在接口级别而不是功能接口中的方法级别指定泛型?感谢您提供的解决方案将泛型类型放在方法上,让方法的调用者“设置”类型,但阻止提供方法的任何人进行适当的类型检查,因为它们依赖于,方法的调用方。如果不尝试传递方法引用,只需传递一个实现ParsingFileFunction的新匿名类就可以了,因为这时您会看到该实现必须提供一个方法
public K getMessage(T inputMessage){
没有类型参数,因此不能满足设置了实际具体类型的
文件实用工具::readMessage
public interface ParsingFileFunction<K, T> {
    K getMessage(T inputMessage);
}
import org.springframework.stereotype.Service;

import java.io.File;

@Service
public class SomeService {

    public Messages getMessage(ParsingFileFunction<Messages, File> parse, File file) {
        return parse.getMessage(file);
    }
}