kotlin

2017-06-01 29 views
13

out out anahtar kelimesi ne anlamadım ve out anahtar kelimeyi kotlin'de bulamadık.kotlin

Burada örnek denetleyebilirsiniz:

List<out T> 

herhangi biri bu anlamını açıklamak durumunda. Bu gerçekten takdir olurdu.

cevap

8

bir tür:

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

T demektir covariant olduğunu Parametre sınıfı T > güvenliC < > Türetilmiş bir süper tip olabilir üzerinden, Cı < Taban ilan edilir.

Bu

örneğin
içinde ile kontrast

Comparable<in T> 

bunu yapmak için: bir sınıf tipi parametre T ilan edildiği

: T anlamına

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

kontravaryant olduğu’de , Cı < Türetilmiş > güvenli bir şekilde Cı <Base> bir süper tip olabilir.

başka yolu da hatırlamak: yılında

Tüketici, Yapımcı dışarı.

Kotlin Generics Variance

+0

gibi şeyler yapabiliriz KOTLIN Örneğin

List<in T> is like List<? implements T> in Java 

bakınız ben biri için en önemli nokta 'Listesini görme düşünüyorum 'açıklaması 'dışarı' yapar değişmez (dışarıda olmayan değişebilir koleksiyonlara kıyasla). Cevapta bahsetmeye ve vurgulamaya yardımcı olabilir.Örtük döküm, ana noktadan ziyade bunun bir sonucudur (List 'a yazamıyor, Liste 'un bir referansı olması güvenli değildir). – minsk

+0

Üzgünüz, Ama yine de anlayamadım. –

4

, manual of kotlin

Kotlin List<out T> tipi boyutu gibi sadece okuma işlemleri sağlayan bir arabirimdir tieno benzeri almak ve bakın. Java'da olduğu gibi, Collection<T>'dan miras alır ve bu da Iterable<T>'dan miras alır. 'un listeyi değiştirdiği yöntemler, MutableList<T> arabirimiyle eklenir. Bu desen KOTLIN yılında

, derleyici bu tür bir şey açıklamak için bir yol yoktur, Set<out T>/MutableSet<T> ve Map<K, out V>/MutableMap<K, V>

Ve bunun için de geçerlidir. Buna bildirim alanı varyansı denir: 'a (üretilen) Source<T> üyelerinden döndüğünden ve hiçbir zaman tüketilmediğinden emin olmak için Kaynak T parametresine açıklama ekleyebiliriz.

> abstract class Source<out T> { 
>  abstract fun nextT(): T } 
> 
> fun demo(strs: Source<String>) { 
>  val objects: Source<Any> = strs // This is OK, since T is an out-parameter 
>  // ... } 

genel kural olduğu: Bu biz değiştirici sağlamak yapmak için bir tür parametresi bir sınıf C ait T dışarı ilan edildiğinde, sadece C üyeleri dışarı-pozisyonunda meydana gelebilir, ancakgeri dönüşünde C<Base>, güvenli bir şekilde C<Derived> bir supertype olabilir. "Akıllı bir deyişle" In

onlar sınıf C parametre T yılında bildirdiğinden, ya o T bir kovaryant tür parametresi olduğunu söylüyorlar. C'yi bir T's üreticisi olarak düşünebilirsiniz ve T 'un bir kullanıcısı DEĞİLDİR. Dışarı değiştirici, varyans açıklaması olarak adlandırılır ve tür parametre bildirim sitesinde sağlanan olduğundan, bildirim alanı varyansı hakkında konuşuruz. Bu, Java'nın kullanım yerinde bulunan joker karakterlerin türlerini kovaryant haline getirdiği kullanım sitesi varyansının tersidir.

List<out T> 

bunu yapabilirsiniz: Bu imza ile

2
List<out T> is like List<? super T> in Java 

ve

val value : List<Any> = listOf(1,2,3) 
//since List signature is List<out T> in Kotlin