2015-11-10 4 views
0

У меня есть этот метод в моем интерфейсе:Generic типа в методе интерфейса Java

public String getValue(); 

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

И я хочу поместить метод в классы, которые возвратят ints, chars или bools (в зависимости от класса). Например, у меня есть класс Animal, который реализует мой интерфейс и имеет этот метод. Я хочу, чтобы он возвращал int, когда этот метод вызывается у животного. У меня есть другой класс, у которого есть этот метод, и когда этот метод вызывается в Person, я хочу, чтобы он возвращал символ.

public class Animal implements myInterface { 
    @Override 
    public int getValue() { 
    return 5; 
    } 
} 

public class Person implements myInterface { 
    @Override 
    public char getValue() { 
    return 'c'; 
    } 
} 

Я понимаю, что я должен делать это с помощью дженериков. Но как именно я это делаю?

Если я заменить строку в интерфейсе с родового типа, как:

public <T> T getValue(); 

то говорит, что я не могу бросить из Int (или полукокса) Т.

Что я должен делать? Благодарю.

+2

Звучит как проблема X/Y. Что представляет собой ваш интерфейс? –

+0

Я думаю, вы должны пересмотреть тот факт, что у вас есть несколько типов для представления «значения». Если все классы имеют «значение», ожидается, что они будут одного типа. В противном случае назовите переменную более подходящим образом и дайте ей свои собственные сеттеры/геттеры. – csmckelvey

+0

Это не должен быть метод getValue, который является общим, но сам интерфейс. –

ответ

4

Правильный способ сделать это, имея общий интерфейс:

public interface MyInterface<T> { 
    public T getValue(); 
} 

public class Animal implements MyInterface<Integer> { 
    @Override 
    public Integer getValue() { 
    return 5; 
    } 
} 

Однако, это действительно воняет, как/проблемы X Y; не говоря уже о том, что он очень неэффективен, боксирует и распаковывает все эти примитивы.

Что вы пытаетесь достичь? Какова ваша цель?

+1

Это то, что, по-видимому, пытался попробовать ОП. «Gotcha» заключается в том, что ему нужно использовать тип объекта («Integer»), а не примитивный тип («int»). В качестве аргументов общего типа могут использоваться только ссылочные типы, а не примитивные типы. – paulsm4

1

На самом деле

public <T> T getValue(); 

может быть преодолен

public Character getValue() 

Это странно ... Это было каким-то backward-comparability фетиша. Не делай этого.


Обычно мы говорим, возвращаемые типы могут быть ковариантны, то есть мы можем возвратить подтип в наиважнейшей методе. Поскольку char является subtype из int, мы можем ожидать, что это должно работать

public int getValue(); 

    // overridden by 
    public char getValue() 

однако, Java requires, что если возвращаемый тип является примитивным, он должен быть одинаковым, не ковариации там.