为何Java无法推断此泛型eliminate方法的返回类型?
Java模拟模式匹配时的类型推断问题
我尝试在Java中模拟模式匹配行为,实现了如下代码:
interface Result<T> { <U> U eliminate(Function<T, U> f, BiFunction<Integer, String, U> g); static <T> Result<T> success(T value) { return new Success<>(value); } } record Success<T>(T value) implements Result<T> { @Override public <U> U eliminate(Function<T, U> f, BiFunction<Integer, String, U> g) { return f.apply(value); } } record Failure<T>(int errCode, String message) implements Result<T> { @Override public <U> U eliminate(Function<T, U> f, BiFunction<Integer, String, U> g) { return g.apply(errCode, message); } }
以下代码可以正常编译运行,输出"Success: 4.0":
public class Main { public static void main(String[] args) { Result<Double> result = Result.success(4.0); var log = result.eliminate( value -> "Success: " + value, (code, message) -> "Failure: " + code + " " + message ); System.out.println(log); } }
但如果省略中间变量log,直接将eliminate的调用传入System.out.println,除非显式指定eliminate的返回类型(即使用result.<String>eliminate(...)),否则Java会出现类型推断失败:
public class Main { public static void main(String[] args) { Result<Double> result = Result.success(4.0); System.out.println(result.eliminate( value -> "Success: " + value, (code, message) -> "Failure: " + code + " " + message )); } }
编译报错信息如下:
% javac -Xdiags:verbose Main.java Main.java:7: error: reference to println is ambiguous System.out.println(result.eliminate( ^ both method println(char[]) in PrintStream and method println(String) in PrintStream match Main.java:7: error: method println in class PrintStream cannot be applied to given types; System.out.println(result.eliminate( ^ required: char[] found: String reason: argument mismatch; inference variable U has incompatible bounds upper bounds: char[],Object lower bounds: String where U,T are type-variables: U extends Object declared in method <U>eliminate(Function<T,U>,BiFunction<Integer,String,U>) T extends Object declared in interface Result 2 errors
内容的提问来源于stack exchange,提问作者Futarimiti
相关产品推荐
相关产品推荐

