具有供应商函数的 Java 泛型不进行类型检查

问题描述 投票:0回答:1

我的问题是我想用通用方法比较两个对象 我可以在其中错误处理任何异常的函数。 在代码示例中,我不明白为什么这段代码会编译。 Object.equals 让我 比较任何对象,但函数预计会限制输入空间。

有人看到这里的问题吗?

public class EqualsMain {
    public static <T> boolean myEquals(T expected, Supplier<T> actual) {
        try {
            T actualValue = actual.get();
        } catch (Throwable e) {
            // do some error handling
        }
        return expected.equals(actual.get());
    }
    public static void main(String[] args) {
        // will compile, even though types don't match
        System.out.println(myEquals(true, () -> ""));
    }
}
java testing generics typechecking
1个回答
0
投票

没有办法阻止这种行为,因为如果

T
Object
,编译就很好。
boolean
String
都可以毫无问题地向上转换为
Object
。无法自动强制这些类型不匹配。 (有一个原因
Objects.equals
的工作方式。)

你可以通过写

EqualsMain.<Boolean>myEquals
来强制它不编译,但这并没有真正解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.