2015-03-18 5 views
1

Простой вопрос: у меня ограниченный общий метод. Я хочу @Override.Метод переопределения с общим типом возврата без предупреждения

class Stuff {} 
class SeriousStuff extends Stuff {} 

interface Overridable { 
    <T extends Stuff> T getStuff(); 
} 

Как я могу сделать это без параметризующего всего Overridable интерфейса и без предупреждений бесконтрольно конверсий?

class SeriourExample implements Overridable { 
    SeriousStaff getStuff() { return new SeriousStuff(); } 
    || 
    \/ 
    /* WARNING: Type safety: The return type SeriousStaff for 
    * getStuff() from the type SeriourExample needs unchecked 
    * conversion to conform to T from the type Overridable 
    */ 
} 

При добавлении @SuppressWarnings("unchecked")еще вежливы и справедливо, то хорошо для меня.

Я знаю this, но все же я не могу использовать предлагаемое решение, потому что я не могу использовать шаблон ?.

Благодаря ? extends Reader вам помочь

+0

Я думаю, вы не можете. –

+0

Здесь 'T' не является общим для класса, а для самого метода. Следовательно, это не имеет смысла. –

+0

@Arnaud: imho может иметь смысл, когда «Overridable» участвует в сложном дереве иерархии, и вы не хотите загрязнять свой код с помощью общих аннотаций при создании/определении/возвращении этих объектов. ? – Campa

ответ

2

Я бы просто избавиться от дженериков и использовать ковариантный возвращаемый тип (это ужасный один я знаю .. не мог сопротивляться.):

interface Overridable { 
    Stuff getStuff(); 
} 

class SeriourExample implements Overridable { 
    @Override SeriousStuff getStuff() { ... } 
} 
+0

Я так думаю ... Боже, я был в дженериках - ад часами доходил до того, что я видел дженерики повсюду и забыл о ковариантном типе возвращения. – Campa

+0

Но .. что делать, если мне нужны дженерики? В несколько более сложном сценарии могут быть два подкласса «SeriousStuff» («VerySeriousStuff» и «TooSeriousStuff»), так что «SeriousExample» не знал, какой из них он получит, и в то же время я не хочу для стирания до класса «SeriousStuff». ? – Campa

+1

Затем используйте generics на уровне интерфейса/класса, а не на уровне метода. –

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