2012-02-21 2 views
8

Если у меня есть следующие:Общий метод - «бесконтрольно преобразования, чтобы соответствовать T от типа» предупреждение

public interface Foo { 
    <T extends Foo> T getBlah(); 
} 

public class Bar implements Foo { 
    public Bar getBlah() { 
     return this; 
    } 
} 

я получаю предупреждение в затмении о реализации «getBlah» в классе Bar:

- Type safety: The return type Bar for getBlah from the type Bar needs unchecked conversion to conform to T from the type 
Foo 

Как это исправить? И почему я получаю предупреждение?

Благодаря

+0

Вы написали, что тип, возвращаемый 'getBlah', должен расширять интерфейс' Foo'. Но «Бар» этого не делает, он его реализует. – vulkanino

+2

'extends' охватывает интерфейсные реализации – Joeblackdev

+0

Случай чрезмерной генерации. См. Комментарий Джоблакдева и ответ Алессандро Сантини. – Saintali

ответ

13

Вы перекрытый метод из своего интерфейса, так что ваша реализация вы должны соответствовать подписи от вашей спецификации:

public class Bar { 
    @Override 
    public <T extends Foo> T getBlah() { 
     return this; 
    } 
} 

Теперь, если вы вместо этого планирует создать специально parametized переопределение всей реализации, то вам необходимо указать общий тип как часть определения интерфейса:

public interface Foo<T extends Foo<T>> { 
    T getBlah(); 
} 

public class Bar implements Foo<Bar> { 
    @Override 
    public Bar getBlah() { 
     return this; 
    } 
} 
+0

И почему, во имя Бога, должен ли он вывести общий тип, который нигде не используется? –

+0

Я не предполагаю, что это весь его код. Потому что вы знаете, что они говорят о предположениях ... – Perception

+0

Первой строкой должен быть 'public interface Foo >' или 'public interface Foo >'. –

3

Я не являюсь уверен, что вы хотите достичь здесь, но я думаю, что возвращение Foo будет в порядке:

interface Foo { 

    public Foo getBlah(); 

} 

как вы не используете общий тип где-нибудь в параметрах.

4
<T extends Foo> T getBlah(); 

означает, что вызывающий абонент может запросить любого типа, как Т должен быть возвращен. Поэтому, независимо от того, какой класс является объектом, я могу запросить какой-нибудь другой случайный подкласс Foo моего выбора для возврата. Единственное значение, которое мог бы вернуть такой метод, - null (если это не опасно), что, вероятно, не то, что вы хотите.

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