Может ли ковариантный параметр типа находиться во входной позиции в конструкторе?

В этом ответе Майкл предполагает, что параметр родового типа должен быть со-вариантом, чтобы создать пустой узел.

Я получаю, что параметр generic type находится во всех выходных позициях, поскольку все свойства Tree<T> и его подтипы доступны только для чтения ( val ).

Но он имеет параметр типа во входной позиции конструктора.

Я думал, что этот код не будет работать на C #, поэтому я попробовал его, и, к моему удивлению, он работал отлично.

 // See this: https://stackoverflow.com/questions/36753579/algebraic-data-types-in-kotlin // Short url: https://stackoverflow.com/a/36753782/303685 interface ITree<out T> { } class Tree<T>: ITree<T> { } sealed class Node<T> : Tree<T> { private readonly T _left; private readonly T _right; public Node(T left, T right) { _left = left; _right = right; } public T Left { get { return _left; } } public T Right { get { return _right; } } } class Program { static void CovarianceTest1() { ITree<object> tree = new Node<string>("Hello", "World!"); } } 

Теперь я понимаю, что, выполняя это упражнение, я узнал что-то новое о разнице.

Итак, мой первый вопрос:

Разрешены ли параметры совместного варианта во входных позициях в конструкторах? В каких других местах параметры типа позволяют игнорировать их классификаторы отклонений?

Еще одна вещь, которую я узнал о дисперсии, заключается в том, что параметр типового типа варианта может даже не отображаться в объявлении интерфейса варианта, как показано в примере ниже.

 interface ITree<out T> { } 

Вы увидите, что ITree<out T> не имеет T ни в ITree<out T> , ни в ITree<out T> . Это также стало для меня шоком.

Мой второй вопрос:

И другой вопрос, который у меня есть, – что такое эквивалент C # типа Nothing в Котлине? В ответе говорится, что Nothing является самым подтипом, который не может быть получен позднее. Это полная противоположность Any (или самый базовый тип на других языках).

Чтобы подражать этому коду в C #, не имело смысла иметь это:

 class Empty : Tree<null> { } 

Потому что это просто незаконный код C # и null также не похоже на Nothing .

Итак, я должен был подделать манекен, чтобы подражать декларации Empty class.

 sealed class Dummy { } sealed class Empty : Tree<Dummy> { private static Empty _empty = null; private static object syncLock = new object(); private Empty() { } public Empty Instance { get { if (_empty == null) { lock (syncLock) { if (_empty == null) { _empty = new Empty(); } } } return _empty; } } } 

Мой третий и последний вопрос:

Поэтому мой последний вопрос: есть ли место, которое содержит исчерпывающий список всех типов, доступных в Котлине, вместе с их описаниями? Потому что, несмотря на то, что на странице « Основные типы» перечислены большинство общих, это, похоже, не является исчерпывающим списком. Типы, не указанные в них, все посыпаны документацией . Как в приведенном выше примере, они просто появляются с упоминанием на странице здесь или там.

Все типы, поставляемые с Kotlin, описаны в его ссылке API , в частности, пакет kotlin :

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/