2017-09-05 3 views
0

私はこれしようとした場合:プライベートエキスパンドタイプからパブリックタイプアーリアを​​使用できないのはなぜですか?

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> 

を...私はエラーを取得する:露出する 'プライベート'、拡張型IMyTypeでtypealias '公共'。

これを防止する理由は何ですか?

注:Kotlin 1.1.4

編集を使用して1

私はtypealiasesが何であるかを理解し、私が代わりに制約の意味を理解しています。

私が求めているのは、これらの制限がそこに存在する必要がある理由です。

私の例のコードを考えてみたら... MyType1(と他の人たち)がこのファイルの外でアクセスできるようにしたいが、raw/generic IMyTypeをこのファイルの外で使用したくない。

これは正当なユースケースではありませんか?

答えて

0

タイプエイリアスの可視性は、対応するタイプと同じか、またはより制限されている必要があります。

ファイルにIMyTypeprivateと宣言すると、IMyTypeはそのkotlinファイル内でのみアクセスできるファイルプライベートクラスです。 IMyTypeのパブリックタイプエイリアスMyType1を宣言した場合、MyType1はどこからでもアクセスできるので、IMyTypeはプライベートでは意味がありません。それは禁止されています。 Kotlin's docから

Type aliases do not introduce new types. They are equivalent to the corresponding underlying types. When you add typealias Predicate<T> and use Predicate<Int> in your code, the Kotlin compiler always expand it to (Int) -> Boolean .

typealiasを持つことの主な目的は、既存のタイプのための代替名を提供することです。あなたの場合、IMyTypeMyType1は同じクラスを指します。ファイル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"); 
} 

脱線問題:公共のサブクラスを通じてあなたはできませんexpose a private super classも新しいタイプが導入されていない表示する

例。

+0

私の最初の編集を参照してください。 – pleasedesktop

+0

@pleasedesktop彼らは同じクラスを指していますが、新しいタイプを導入していません。状況を示す例を追加しました。 – BakaWaii

0

定義では、typealiasは、既存のタイプの代替名を提供します。したがって、タイプアリアスによる既存のタイプの可視性を促進することはできません。

タイプアリアのgrammarから、コードにタイプアリアを使用する場合は、タイプアリアスの可視性が既存のタイプの可視性より低いか等しいことを確認する必要があります。たとえば、

internal class Bar 

private typealias PrivateFoo = Bar 

internal typealias InternalFoo = Bar 

//v--- error 
public typealias PublicFoo = Bar 
+0

私の最初の編集を参照してください。 – pleasedesktop

+0

@pleasedesktopこんにちは、これは、クライアントが見ることができない 'typealias'を通してクラスを公開しようとしているからです。 –

+0

クライアントはそれを見ることができますが、それを使用することはできません。これはまさに私が行っている動作です。展開されたタイプは汎用ですが、ジェネリックを公開したくないので、ジェネリックでないものをタイプアリアを介して公開したいと思います。 – pleasedesktop

関連する問題