Я новичок в Java, изучаю фреймворк Hamcrest.
Я прочитал код интерфейса Matcher и не понимаю комментарий и сигнатуру метода matches(Object actual)
. Я ожидал, что это будет matches(T actual)
, и использую тип c типа T
вместо Object
, который принимает все.
Это исходный код: https://github.com/hamcrest/JavaHamcrest/blob/master/hamcrest/src/main/java/org/hamcrest/Matcher.java
для метода matches
:
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 решил, что лучше использовать Object в качестве входных данных, а не тип * generic c для интерфейса, который объявлен как generi c public interface Matcher<T> extends SelfDescribing