1. ホーム
  2. generics

[解決済み] kotlinのoutキーワードとは

2022-06-16 18:41:42

質問

の意味がよくわかりません。 アウト のキーワードの意味がわかりませんでした。

サンプルはこちらで確認できます。

List<out T>

この意味を説明できる人がいたら それは本当にありがたいことです。

どのように解決するのですか?

この署名で。

List<out T>

とすればよい。

val doubleList: List<Double> = listOf(1.0, 2.0)
val numberList: List<Number> = doubleList

というのは T 共変 :

型パラメタが T クラスの C が宣言されている場合 アウト , C<ベース> は安全に スーパータイプ C<Derived> .

とは対照的です。 とは異なり、例えば

Comparable<in T>

とすればよい。

fun foo(numberComparable: Comparable<Number>) {
  val doubleComparable: Comparable<Double> = numberComparable
  // ...
}

というのは T 反変数 :

型パラメタが T クラスの C が宣言されている場合 , C<Derived> は、安全に スーパータイプ C<ベース> .

もう一つの覚え方。

消費者 生産者 アウト .

見る Kotlin Generics Varianceを参照してください。

-----------------2019年1月4日に更新された------------------。

には、"。 コンシューマー・イン、プロデューサー・アウト の場合、Producerから読み込むだけ - T型の結果を得るためのメソッドを呼び出し、Consumerに書き込むだけ - T型のパラメータを渡してメソッドを呼び出すのです。

の例では List<out T> の例では、これができることは明らかです。

val n1: Number = numberList[0]
val n2: Number = doubleList[0]

ということで、安全なのは List<Double> とした場合 List<Number> が期待されるため List<Number> のスーパータイプです。 List<Double> の上位型であり、その逆はありません。

の例では Comparable<in T> :

val double: Double = 1.0
doubleComparable.compareTo(double)
numberComparable.compareTo(double)

ということで、安全なのは Comparable<Number> とした場合 Comparable<Double> が期待されるため Comparable<Double> のスーパータイプです。 Comparable<Number> の上位型であり、その逆はありません。