1

在其接口中具有泛型参数的方法:

interface Assert<S, A> {
    S isEqualTo(A expected);

Object在其抽象类中被参数覆盖:

abstract class AbstractAssert<S ..., A> implements Assert<S, A> {
    @Override
    S isEqualTo(Object expected)

如何isEqualTo()用 的泛型参数A覆盖Assert<S, A>,如

class MyAssert extends AbstractAssert<MyAssert, MyClass> {
    @Override
    MyAssert isEqualTo(MyClass expected)

由于类型擦除而失败:

名称冲突:MyAssert 中的 isEqualTo(MyClass) 覆盖了一个擦除方法与另一个方法相同的方法,但都没有覆盖另一个

第一种方法:AbstractAssert 中的 isEqualTo(Object)
第二种方法:Assert 中的 isEqualTo(A#2),
其中 A#1、A#2 是类型变量:
A#1 扩展类 AbstractAssert 中声明的
对象 A#2 扩展接口中声明的对象断言

还有其他方法吗?

assertJ用 Object 遮蔽泛型参数有什么好处?

4

1 回答 1

2

isEqualTo采用Objectas 参数的原因是为了灵活。

例子:

Object name = "John";
// would not compile if isEqualTo expected a String parameter 
assertThat("John").isEqualTo(name);

您不能覆盖方法并缩小其参数类型。

于 2015-03-20T03:21:50.480 回答