Почему мы не можем публиковать типы типов из частных расширенных типов?

Если я попробую:

sealed class Attributes data class Attributes1( val prop1: String ) : Attributes() private data class IMyType<A>( val attributes: A ) where A: Attributes typealias MyType1 = IMyType<Attributes1> 

… Я получаю сообщение об ошибке: «public» typealias предоставляет «private» в расширенном типе IMyType .

Что является / является причиной (-ами) для предотвращения этого?

Примечание. Использование Kotlin 1.1.4

Редактировать 1

Я понимаю, что такое типы, и я понимаю последствия существующих ограничений.

Я спрашиваю, почему эти ограничения должны быть там.

Если вы рассматриваете мой пример кода … Я хочу, чтобы MyType1 (и, возможно, другие) был доступен за пределами этого файла, но я не хочу использовать raw / generic IMyType вне этого файла.

Разве это не законный случай использования?

По определению typealias должен предоставить альтернативное имя для существующего типа. Таким образом, вы не можете продвигать видимость существующего типа по типам.

Из грамматики типаалий, если вы хотите использовать типтиалы в своем коде, вы должны убедиться, что видимость типов была меньше или равна видимости существующего типа. например:

 internal class Bar private typealias PrivateFoo = Bar internal typealias InternalFoo = Bar //v--- error public typealias PublicFoo = Bar 

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

Когда вы объявляете IMyType как private в вашем файле, IMyType является IMyType -частным классом, доступ к которому возможен только внутри этого файла kotlin. Если вы объявите публичный псевдоним MyType1 для IMyType , то для IMyType имеет значения, поскольку MyType1 может быть доступен во всем мире. Таким образом, это запрещено.

Из документа Котлина :

Алиасы типа не вводят новые типы. Они эквивалентны соответствующим базовым типам. Когда вы добавляете typealias Predicate<T> и используете Predicate<Int> в своем коде, компилятор Kotlin всегда расширяет его до (Int) -> Boolean .

Основная цель создания typealias – предоставить альтернативное имя для существующих типов. В вашем случае оба IMyType и MyType1 относятся к одному классу. Вы не можете получить доступ к IMyType через MyType1 вне файла, так как IMyType намеревается быть закрытым.

Пример отображения нового типа не вводится:

 //Kotlin code fun acceptMyType1(type: MyType1) {} //Decompiled code, MyType1 is not used public static final void acceptMyType1(@NotNull IMyType type) { Intrinsics.checkParameterIsNotNull(type, "type"); } 

Проблема с боковым уклоном: вы не можете выставлять частный суперкласс через общедоступный подкласс.