Переопределение универсального метода необработанного типа - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть универсальный класс с универсальным методом

class Foo<T> {
    public <E> E execute() {
        return null;
    }
}

Может кто-нибудь объяснить мне, почему это:

class Bar extends Foo {
    public <E> E execute() {
        return null;
    }
}

выдает ошибку

execute ()в баре происходит конфликт с execute () в Foo;оба метода имеют одинаковое стирание, но ни один из них не переопределяет другой

, тогда как это нормально

class Bar extends Foo<Object> {
    public <E> E execute() {
        return null;
    }
}

1 Ответ

0 голосов
/ 28 ноября 2018

В первом примере вы используете необработанный тип Foo, поэтому сигнатура метода Foo равна public Object execute().Это противоречит общей версии в Bar.На самом деле это легко воспроизвести без наследования, например:

class Foo
{
    public <E> E execute() { return null; }
    public Object execute() { return null; }
}

Во втором примере вы не используете необработанный тип Foo, поэтому сигнатуры методов execute точно совпадают.В этом случае это просто простой метод переопределения.Таким образом, вы, вероятно, должны аннотировать его.

class Bar extends Foo<Object> {
    @Override
    public <E> E execute() {
        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...