You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:12:10