如何从 AbstractAssert 覆盖泛型 isEqualTo
How to override generic isEqualTo from AbstractAssert
接口中带有泛型参数的方法:
interface Assert<S, A> {
S isEqualTo(A expected);
在其摘要中被 Object
参数覆盖 class:
abstract class AbstractAssert<S ..., A> implements Assert<S, A> {
@Override
S isEqualTo(Object expected)
如何使用 Assert<S, A>
的通用参数 A
覆盖 isEqualTo()
,如
class MyAssert extends AbstractAssert<MyAssert, MyClass> {
@Override
MyAssert isEqualTo(MyClass expected)
由于类型擦除而失败:
name clash: isEqualTo(MyClass) in MyAssert overrides a method whose erasure is the same as another method, yet neither overrides the other
first method: isEqualTo(Object) in AbstractAssert
second method: isEqualTo(A#2) in Assert
where A#1,A#2 are type-variables:
A#1 extends Object declared in class AbstractAssert
A#2 extends Object declared in interface Assert
还有其他方法吗?
用 Object 隐藏通用参数有什么 assertJ
好处?
isEqualTo
之所以取一个Object
作为参数是为了灵活
示例:
Object name = "John";
// would not compile if isEqualTo expected a String parameter
assertThat("John").isEqualTo(name);
您不能重写方法并缩小其参数类型。
接口中带有泛型参数的方法:
interface Assert<S, A> {
S isEqualTo(A expected);
在其摘要中被 Object
参数覆盖 class:
abstract class AbstractAssert<S ..., A> implements Assert<S, A> {
@Override
S isEqualTo(Object expected)
如何使用 Assert<S, A>
的通用参数 A
覆盖 isEqualTo()
,如
class MyAssert extends AbstractAssert<MyAssert, MyClass> {
@Override
MyAssert isEqualTo(MyClass expected)
由于类型擦除而失败:
name clash: isEqualTo(MyClass) in MyAssert overrides a method whose erasure is the same as another method, yet neither overrides the other
first method: isEqualTo(Object) in AbstractAssert
second method: isEqualTo(A#2) in Assert
where A#1,A#2 are type-variables:
A#1 extends Object declared in class AbstractAssert
A#2 extends Object declared in interface Assert
还有其他方法吗?
用 Object 隐藏通用参数有什么 assertJ
好处?
isEqualTo
之所以取一个Object
作为参数是为了灵活
示例:
Object name = "John";
// would not compile if isEqualTo expected a String parameter
assertThat("John").isEqualTo(name);
您不能重写方法并缩小其参数类型。