2013-12-07 6 views
7

Мне было трудно думать о титуле для этого, так что простите меня.Подпись интерфейса интерфейса «неправильная»

У меня есть интерфейс со следующими методами:

public interface Algorithm<E,F> { 
    public Set<? extends Algorithm<E,F>> map(int numPartitions); 
    public F reduce(Set<? extends Algorithm<E,F>> partitions); 
} 

и класс, реализующий Algorithm со следующими методами:

public class LinearSearch<T> implements Algorithm<List<T>, Integer> { 
    @Override 
    public Set<LinearSearch<T>> map(int numPartitions) { 
     return null; 
    } 

    @Override 
    public Integer reduce(Set<LinearSearch<T>> partitions) { 
     return null; 
    } 
} 

Теперь Странным является то, что Eclipse, жалуется на второй метод , reduce.

The method reduce(Set<LinearSearch<T>>) of type LinearSearch<T> must override or implement a supertype method.

Это несмотря на то, что метод map это хорошо. Так где я иду не так?

ответ

10

Переопределение методов и параметров Типы

О методе reduce, то параметр должен быть Set<? extends Algorithm<List<T>,Integer>>. Он должен принимать любые Set<? extends Algorithm<List<T>,Integer>>, а не только Set<LinearSearch<T>>. Вы не можете сузить тип параметра, переопределив метод.

JLS, Section 8.4.8.1 конкретизирует сигнатур методов временной отмены:

Метод экземпляра m1, объявленных в классе C, перекрывает другой метод экземпляра m2, объявленный в классе А тогда и только тогда все из следующих условий:

C является подклассом A.

Подпись m1 является подзаголовкой (§8.4.2) подписи m2.

Либо:

м2 являются открытым, защищенным, или объявленным с доступом по умолчанию в том же пакете, C или

m1 переопределяет метод м3 (м3 отличающихся от m1, m3, отличных от м2), так что m3 переопределяет m2.

Здесь термин «поднарядка» относится к сопоставлению типов параметров после стирания типа.

Переопределение Методы и типы возвращаемых

Но почему map метод работы?Поскольку Java позволяет разработчику сузить возвращаемый тип переопределяющих методов в подклассах.

А другой section of the JLS, 8.4.5, охватывает типы возвращаемых в преобладающих методов:

возвращаемые типы могут меняться в зависимости от методов, которые переопределяют друг с другом, если возвращаемые типы являются ссылочными типами. Понятие возвращаемости-заменимости поддерживает ковариантные возвращения, то есть специализацию типа возврата к подтипу.

Способ декларация d1 с обратным типом R1 является возвратным типом замещаемым для другого метода d2 с обратным типом R2, тогда и только тогда, когда выполнены следующие условия:

Если R1 вл етс недействительным, то R 2 является недействительным.

Если R1 является примитивным типом, то R2 идентичен R1.

Если R1 обозначает ссылочный тип, то:

R1 обозначает либо подтип R2 или R1 может быть преобразован в подтип R2 путем неконтролируемого преобразования (§5.1.9) или

R1 = | R2 |

(выделено мной)

2

Ваш заголовок метод должен быть следующим

public Integer reduce(Set<? extends Algorithm<List<T>, Integer>> partitions) 

Для того, чтобы переопределить метод, который вы должны использовать одни и те же типы параметров. Если нет, это не считается одним и тем же методом.

Обратите внимание, что типы <E,F> являются параметризованной частью этого заголовка, так что здесь Java дает вам свободу и позволяет использовать типы, указанные в определении класса.

Смежные вопросы