Итак, у меня есть класс с универсальным типом

class GenericClass<T> {
// At some point in the class I have variable item of type T
val name: String = item.name
}

Я точно знаю, что тип T GenericClass будет использоваться с классом, имеющим свойство «name». Но, конечно же, в строке я получил «Неразрешенное ссылочное имя». Android Studio сгенерировала мне этот код с помощью «Создать свойство расширения T.name».

private val <T> T.name: String
    get() {}

Я действительно не знаю, что поставить в скобку {} после получения. Я попробовал return name, но у меня возникла рекурсивная ошибка свойства.

Любые идеи ?

Благодарность

0
gee3107 30 Мар 2021 в 09:53

2 ответа

Лучший ответ

Если вы знаете, что каждый тип T имеет свойство name, вы можете объявить его неявно:

// GenericClass.kt
class GenericClass<T : HasName> {
    // At some point in the class I have variable item of type T
    val name: String = item.name
}

// HasName.kt
// Create new interface with "name" property
interface HasName {
    val name: String
}

Но также вы должны реализовать этот новый интерфейс для всех классов, которые могут использоваться как T.

0
Dmitry Barskov 30 Мар 2021 в 07:46

Я точно знаю, что тип T GenericClass будет использоваться с классом, имеющим свойство «name».

Затем вам нужно явно заявить об этом. По умолчанию T расширяет Any?. Вам нужно сузить возможные типы T, объявив некоторый интерфейс, например

interface Named {
    val name : String
}

И передача T : Named в качестве универсального параметра. Также вам нужно создать все классы, которые вы собираетесь передать в качестве универсального параметра для реализации этого интерфейса. Кстати, сам класс GenericClass<T : Named> может быть объявлен как реализующий этот интерфейс:

class GenericClass<T : Named> : Named {
    override val name: String = item.name
}
0
Михаил Нафталь 30 Мар 2021 в 07:53