Тип возвращаемого метода - PullRequest
       23

Тип возвращаемого метода

0 голосов
/ 14 сентября 2018

Разрешает ли тип возвращаемого метода универсальный метод на основе ссылки на значение? например,

public class TestGenericMethod
{
    public static void main(String[] args)
    {
        TestGenericMethod dis = new TestGenericMethod();
        String str = dis.getFirst(singletonList("String"));
        System.out.println("| String  ==> " + str);

        Integer in = dis.getFirst(singletonList(5));
        System.out.println("| Integer ==> " + in);
    }

    private <T> T getFirst(List<Object> objs)
    {
        return (T) objs.get(0);
    }
}

Ссылаясь на фрагмент кода, этот код компилируется и выполняется изящно. Мой вопрос здесь, так как я не являюсь объектом списка приведения типов к моему типу, тип возвращаемого значения совместим как с String, так и с Integer. Так разрешается ли тип возвращаемого значения на основе ссылки на значение?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Компилятор пытается вывести T, и единственное место, из которого он может вывести его в вашей ситуации, - это посмотреть на тип переменной, в которой вы хотите сохранить возвращенные значения T.

0 голосов
/ 14 сентября 2018

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

Если проверить байт-код класса, фактический тип возврата метода getFirst() равен Object.

// signature <T:Ljava/lang/Object;>(Ljava/util/List<Ljava/lang/Object;>;)TT;
private getFirst(Ljava/util/List;)Ljava/lang/Object;

Atво время выполнения JVM проверяет фактический тип объекта, возвращенного из getFirst(), и выдает ClassCastException, если он отличается.

INVOKESPECIAL TestGenericMethod.getFirst (Ljava/util/List;)Ljava/lang/Object;
CHECKCAST java/lang/Integer
0 голосов
/ 14 сентября 2018

Тип возвращаемого значения определяется компилятором из типа переменной, которой вы присваиваете результат (str, in).

Фактический тип возвращаемого значения, конечно же, будет таким, каким является тип первого объекта списка, и вы можете получить ClassCastException во время выполнения, так как ваш код не безопасен и выигнорирование общего состава не проверяется.Попробуйте например

Integer oops = dis.getFirst(singletonList("hello"));
...