8

我刚刚写了一个简单的 JUnit Matcher,当然assertThat()它需要Generics

幸运的是,我找到了返回类型的正确语法static <T>Matcher not(Matcher<T> m)...,尽管我不明白为什么

  • 返回类型中它<T>Matcher
  • 参数列表Matcher<T>

为什么它<T>Matcher在返回类型中?这背后的概念是什么?

我来自 C++,可以很好地处理它的模板。我知道泛型的工作方式不同,但这就是为什么这让我感到困惑。

这是我自己的Matcher课。看看静态助手not

import org.hamcrest.*;

/** assertThat(result, not(hasItem("Something"))); */
class NotMatcher<T> extends BaseMatcher<T> {
    /** construction helper factory */
    static <T>Matcher not(Matcher<T> m) {  //< '<T>Matcher' ???
        return new NotMatcher<T>(m);
    }
    /** constructor */
    NotMatcher(Matcher<T> m) { /* ... */  }
    /* ... more methods ... */
}
4

2 回答 2

12

Towi 我希望这个插图有帮助。

在此处输入图像描述

上图是对问题标题的直接回应:为什么它<T>Type是 Java 泛型中的返回类型而不是返回类型Type<T>

在 Towi 的示例中还有其他几点需要考虑,请参阅评论跟踪。

于 2013-05-07T15:25:07.623 回答
10

你真的想要

static <T> Matcher<T>

您需要第一个“T”来声明泛型方法的类型。第二个“T”是 Matcher 类的类型参数。

于 2013-05-07T15:19:38.103 回答