Проекция звезды Котлина на контравариантные типы

Я читаю и пытаюсь понять проекции типа Котлин, иногда я придумываю такие вещи: введите описание изображения здесь

Что означает контравариантный тип, чтобы иметь звездную проекцию и как она возникает

Solutions Collecting From Web of "Проекция звезды Котлина на контравариантные типы"

Это также объясняется в документации Kotlin:

Для Foo<in T> , где T – параметр контравариантного типа, Foo<*> эквивалентен Foo<in Nothing> . Это означает, что вы ничего не можете записать в Foo<*> безопасным способом, когда T неизвестно.

пример

У нас есть класс Foo<T> с контравариантным T (сайт-декларация), т.е. Foo работает только как потребитель T :

 class Foo<in T> { fun accept(t: T) { println(t) } } 

Мы можем использовать этот тип в простых общих функциях следующим образом:

 fun <F> usingFoo(con: Foo<F>, t: F) { con.accept(t) } 

(используется F для того, чтобы отличить от параметра типа типа T )

Это прекрасно работает, поскольку мы используем Foo как предполагалось: как потребитель T s.

Теперь ваша цитата просто говорит, что наличие параметра типа con: Foo<*> вместо con: Foo<T> будет иметь следующий эффект: «вы не можете вызывать любые методы, которые имеют T в сигнатуре» .

Таким образом, следующее не выполняется:

 fun <F> usingFoo(con: Foo<*>, t: F) { con.accept(t) //not allowed!! } 

Небезопасно вызывать accept с экземпляром F потому что мы не знаем тип Foo (обозначается звездообразной проекцией ).

Star Projection : Иногда вы хотите сказать, что ничего не знаете о аргументе типа, но все же хотите использовать его безопасным способом. Безопасным способом здесь является определение такой проекции родового типа, что всякое конкретное создание этого родового типа будет подтипом этой проекции.