Принятие решения на основе generi c типа в java - PullRequest
0 голосов
/ 09 июля 2020

У меня есть общий c класс, у которого есть метод getOutput. Я хочу принять решение на основании типа Т (типа класса). Я попробовал следующее, но это не сработало.

class Test<T> implements Interface1<T> {

public T getOutput(String input) {
    
     if (T instanceof Class1) {
       //do something
     } else {
       //do something else
     }
}

}

Ответы [ 3 ]

0 голосов
/ 09 июля 2020

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

См.: https://docs.oracle.com/javase/tutorial/java/generics/genMethods.html

Вам нужно будет использовать параметр метода для передачи ожидаемого типа:

interface Value {
    <T> T get(Class<T> tag);
}

class TheValue implements Value {
    @Override
    public <T> T get(final Class<T> tag) {
        if (tag.isAssignableFrom(String.class)) {
            return (T) "something";
        } else {
            return null;
        }
    }
}
0 голосов
/ 09 июля 2020

Я пробовал следующее. Что, вы парни, думаете? Сообщите мне, если у вас есть лучшее решение. Мы также можем обсудить решения, использующие шаблон проектирования, например шаблон стратегии. Мне нужен этот класс, чтобы давать ответы в разных форматах. сказать. Строка или целое число ... Или Class1 или Class2 (например)

class Test<T> implements Interface1<T> {

public T getOutput(String input, Class<T> type) {
    
     if (type.isAssignableFrom(String.class)) {
       //do something
       String answer = "10"; // example answer
       return type.cast(answer); 
     } else {
       //do something else
     }
}

}
0 голосов
/ 09 июля 2020

здесь вы не определили какую-либо переменную типа That T для проверки в методе, поэтому вы можете проверить ее с помощью

class Test<T> implements Interface1<T> {

    public T getOutput(String input,T generic) {

        if (generic instanceof Class1) {
            //do something
        } else {
            //do something else
        }
        return null;
    }

}
...