Общий интерфейс Java с List не принимает тип объекта…

DtoMapper: это интерфейс, который определяет контракт, в котором любые сторонние сопоставители должны возвращать объекты как

    public interface DtoMapper<T> {

    /**
     * Converts list of T into FooResponse
     * @param List of T
     * @return FooResponse
     */
    FooResponse convertToFooResponse(final List<T> rewards);

FooMapper: реализует DtoMapper передачу списка Bar в качестве аргумента метода, однако компилятору не нравится мое переопределение реализации метода и ему нужна вторая реализация (внизу).

public final class FooMapper implements DtoMapper {


    @Override
    FooResponse convertToFooResponse(final List<Bar> listOfBars) {
        ... Logic
    }

     @Override
    public convertToFooResponse(final List listOfBars) {
        ... I dont want this
    }

Как я могу заставить мой интерфейс работать с этим требованием, чтобы в будущем появилась другая реализация, скажем, public convertToFooResponse(final list<Snafu> listOfSnafus);?

0
tomaytotomato 8 Сен 2016 в 14:02

3 ответа

Лучший ответ

Вам необходимо явно реализовать DtoMapper<Bar> вместо DtoMapper.

Примере:

public interface DtoMapper<T> {

    /**
    * Converts list of T into FooResponse
    * @param List of T
    * @return FooResponse
    */
    FooResponse convertToFooResponse(final List<T> rewards);
}

public class FooMapperImplementation implements DtoMapper<Bar> {
    @Override
    public FooResponse convertToFooResponse(List<Bar> rewards) {
        return null;
    }
}
3
Jose Ignacio Acin Pozo 8 Сен 2016 в 11:07

Вы забыли параметризованный тип

class FooResponse{}
class First{}
class Second{}

public interface DtoMapper<T> {
    FooResponse convertToFooResponse(final List<T> rewards);    
}

class FirstMapper implements DtoMapper<First> {
    @Override
    public FooResponse convertToFooResponse(List<First> list) {
        return null;
    }
}

class SecondMapper implements DtoMapper<Second> {
    @Override
    public FooResponse convertToFooResponse(List<Second> list) {
        return null;
    }
}
1
Ady Junior 8 Сен 2016 в 11:13

При реализации класса вам необходимо передать общую спецификацию:

public final class FooMapper implements DtoMapper<Bar> {
// Here -----------------------------------------^

    @Override
    FooResponse convertToFooResponse(final List<Bar> listOfBars) {
        ... Logic
    }
3
Mureinik 8 Сен 2016 в 11:08