Как передать универсальный аргумент в метод Object Object? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть метод foo с общим аргументом <T>, который необходимо передать методу потребления Object. Почему нам нужно привести к Object, все расширяется Object?

fun <T> foo(arg:T) {
    bar(arg)            //doesn't compile
    bar(arg as Object)  //compiles only with cast to Object
}

fun  bar(x:Object){} 

1 Ответ

0 голосов
/ 17 мая 2018

Вы не указали никакой верхней границы для T. Поэтому используется подразумеваемая верхняя граница: T: Any?.

Функция bar() принимает Object, а Any? не совместима с ней. Object является одним конкретным подтипом Any?.

Другим конкретным подтипом Any? является Int, и он также не является подтипом Object. Не обнуляемый Int компилируется в примитив JVM типа int, который явно не является экземпляром Object.

Наконец, вам следует пересмотреть использование Object в любом месте Котлина; моя IDE сразу помечает его предупреждением. Итак, объявляем

fun bar(x: Any?) { }

или, если вы хотите применить ненулевое значение,

fun bar(x: Any) { }

В последнем случае вы также должны ограничить верхнюю границу для T:

fun <T: Any> foo(arg: T) { ... }

Однако пример кода, который вы разместили, даже не мотивирует универсальный параметр T, поэтому, возможно, все, что вам нужно, это

fun foo(x: Any) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...