我的问题是我想用通用方法比较两个对象 我可以在其中错误处理任何异常的函数。 在代码示例中,我不明白为什么这段代码会编译。 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, () -> ""));
}
}
没有办法阻止这种行为,因为如果
T
是 Object
,编译就很好。 boolean
和 String
都可以毫无问题地向上转换为 Object
。无法自动强制这些类型不匹配。 (有一个原因Objects.equals
的工作方式。)
你可以通过写
EqualsMain.<Boolean>myEquals
来强制它不编译,但这并没有真正解决问题。