2015-03-19 6 views
1

Метод с общим параметром в его интерфейсе:Как переопределить общий isEqualTo из AbstractAssert

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>, as

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

терпит неудачу из-за типа стирания:

конфликт имен: isEqualTo (МойКласс) в MyAssert переопределяет метод которого стирание такого же, как другой метод, но ни перекрывает другой

первого метод: isEqualTo (Object) в AbstractAssert
второй метод: isEqualTo (А # 2) в Assert
где А # 1, # 2 являются тип-переменные:
A # 1 проходит Объект объявлен в классе AbstractAssert
A # 2 проходит объект объявлен в интерфейсе Assert

Есть ли другой способ?

Какой assertJ коэффициент усиления теневого параметра с объектом?

ответ

2

Причина, по которой isEqualTo принимает параметр Object как параметр, должен быть гибким.

Пример:

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

Вы не можете переопределить метод и сузить его тип параметров.