Java 为什么Hamcrest`matches`方法使用对象作为输入类型,而不使用泛型类型作为输入

Java 为什么Hamcrest`matches`方法使用对象作为输入类型,而不使用泛型类型作为输入,java,generics,matcher,hamcrest,Java,Generics,Matcher,Hamcrest,我是Java新手,正在学习Hamcrest框架 我已经阅读了Matcher接口的代码,但我不理解matches(Object-actual)的注释和方法签名。我希望它是匹配(T实际),并使用泛型类型T,而不是接受所有内容的对象 这是源代码: 对于匹配的方法: public interface Matcher<T> extends SelfDescribing { /** * Evaluates the matcher for argument <var>it

我是Java新手,正在学习Hamcrest框架

我已经阅读了Matcher接口的代码,但我不理解
matches(Object-actual)
的注释和方法签名。我希望它是
匹配(T实际)
,并使用泛型类型
T
,而不是接受所有内容的
对象

这是源代码:

对于匹配的
方法:

public interface Matcher<T> extends SelfDescribing {

/**
     * Evaluates the matcher for argument <var>item</var>.
     *
     * This method matches against Object, instead of the generic type T. This is
     * because the caller of the Matcher does not know at runtime what the type is
     * (because of type erasure with Java generics). It is down to the implementations
     * to check the correct type.
     *
     * @param actual the object against which the matcher is evaluated.
     * @return <code>true</code> if <var>item</var> matches, otherwise <code>false</code>.
     *
     * @see BaseMatcher
     */
    boolean matches(Object actual);
阅读上述方法的评论,表明这是有意的,我不明白为什么。我知道java中什么是类型擦除。但我仍然不明白为什么Hamcrest的设计者认为最好将对象作为输入,而不是将接口的泛型类型声明为泛型
public interface Matcher扩展了自描述功能

你是对的,一开始你希望
T
而不是
Object
,但是知道泛型是编译时的特性,在运行时不可用(当测试运行并且需要匹配器时)(请参阅类型擦除)强调这样一个事实是很有意义的,从技术上讲,它可能是一种不存在的东西,因此在这种情况下,您必须进行检查以创建更清晰的错误消息

类型擦除(摘自):

类型擦除确保没有为不同的泛型生成额外的类。它

  • 按其边界或对象替换所有泛型类型
  • 引入自动强制转换
  • 创建适配器方法以保留多态性
这样就不会有运行时开销。

Q:

我不明白为什么

答:(来自JavaDocs)

这是因为Matcher的调用者在运行时不知道类型是什么(因为Java泛型的类型擦除)。这取决于实现 检查正确的类型

同样来自JavaDocs:

使用Hamcrest时,无法保证调用
matches()
descripebematch()
的频率

您必须了解Hamcrest Libs的实现。
因此,您的
matches()
实现由Hamcrest(使用任何对象)在内部调用。在运行时,Hamcrest没有机会知道(并找到!)正确的
匹配(…)
方法,因为泛型已被清除。如果通过Hamcrest传递的对象确实匹配,则需要检查自己。这与Hamcrest没有多大关系


干杯

是的,但是这样的话,如果我创建了例如custom matcher的类型,并使用数字输入调用matches方法,编译器不会警告我。@EliyahuMachluf我既不是hamcrest的开发人员,也不是hamcrest的贡献者,只能猜测原因。唯一有效的来源是hamcrest团队的一名成员。你可能想向我提出你的问题。好的。谢谢,我会考虑在哈姆雷斯特论坛上发布这个问题。