【问题标题】:Java Lambda Method Reference - Clarity RequiredJava Lambda 方法参考 - 需要清楚
【发布时间】:2020-11-04 08:46:15
【问题描述】:

我在传递 lambda 方法引用时遇到错误,类型不兼容。 在调用 FUnctional Interface 方法时,代码编译得非常好并替换了具体对象。虽然传递方法引用它抛出类型不兼容。请解开我的误会

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

【问题讨论】:

    标签: java generics lambda compiler-errors


    【解决方案1】:

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

    ParsingFileFunction.java

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

    请注意,类型已移至接口定义。

    SomeService.java

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

    注意file 声明中的显式类型。

    【讨论】:

    • 这行得通,是否必须在接口级别指定泛型,而不是在功能接口中指定方法级别?感谢您的解决方案
    • 将泛型类型放在方法上让方法的调用者“设置”类型,但阻止任何提供方法的人进行适当的类型检查,因为它们依赖于调用者方法。
    • 很明显,不是尝试传递方法引用,而是简单地传递一个实现 ParsingFileFunction 的新匿名类,因为这样您就会看到实现必须提供一个方法 public &lt;K, T&gt; K getMessage(T inputMessage) { 没有类型参数和因此不满足 e。 G。 FileUtility::readMessage 设置了实际的具体类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多