猿问

Java - 一种通用的数字方法

虽然我在这里使用 Hamcrest 库,但它可能不是 Hamcrest 问题而是纯 Java ...

我有以下方法:

public static void isGreaterThan(int valueToValidate, int minExpectedVal) {
    MatcherAssert.assertThat(valueToValidate, greaterThan(minExpectedVal));
}

我想将其概括为:

public static <T> void isGreaterThan(T valueToValidate, T minExpectedVal) {
    MatcherAssert.assertThat(valueToValidate, greaterThan(minExpectedVal));
}

或者

public static void isGreaterThan(Number valueToValidate, Number minExpectedVal) {
    MatcherAssert.assertThat(valueToValidate, greaterThan(minExpectedVal));
}

Hamcrest 大于签名是:

<T extends Comparable<T>> Matcher<T> greaterThan(T value)

和 assertThat 签名:

<T> void assertThat(T actual, Matcher<? super T> matcher)

但是,在这两种情况下,我都在 minExpectedVal 上收到错误消息,说它不能作为 T 应用。

我怎样才能克服这个?


红糖糍粑
浏览 120回答 1
1回答

拉莫斯之舞

您需要为您的通用版本添加一个绑定。public&nbsp;static&nbsp;<T&nbsp;extends&nbsp;Comparable<T>>&nbsp;void&nbsp;isGreaterThan(T&nbsp;valueToValidate,&nbsp;T&nbsp;minExpectedVal)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;MatcherAssert.assertThat(valueToValidate,&nbsp;greaterThan(minExpectedVal)); }请注意,Numbers不可比较;你可以为他们做public&nbsp;static&nbsp;void&nbsp;isGreaterThan(Number&nbsp;valueToValidate,&nbsp;Number&nbsp;minExpectedVal)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;MatcherAssert.assertThat(valueToValidate.doubleValue(),&nbsp;greaterThan(minExpectedVal.doubleValue())); }编辑:Torben 是正确的,doubleValue()不一定是无损的。但是,唯一Number不是它的标准子类型是Long,BigInteger和BigDecimal, 因此您可以明确地检查它们。但是无论哪种方式,通用版本都更好。
随时随地看视频慕课网APP

相关分类

Java
我要回答