수색…


소개

목록은 숫자, 단어 또는 실제로 아무것도 저장할 수 있습니다. 이것이 우리가 List를 generic 이라고 부르는 이유입니다.

Generics는 기본적으로 클래스가 보유 할 수있는 유형과 객체가 현재 보유하고있는 유형을 정의하는 데 사용됩니다.

통사론

  • 클래스 ClassName < TypeName >
  • class ClassName <*>
  • ClassName <in UpperBound >
  • ClassName <out LowerBound >
  • 클래스 이름 < TypeName : UpperBound >

매개 변수

매개 변수 세부
TypeName 유형 일반 매개 변수의 이름
상한 공변량 유형
하한 반 변이 형
ClassName 수업 이름

비고

함축 된 상한은 Nullable입니다.

Kotlin Generics에서 유형 매개 변수 T 의 상한은 Any? . 그러므로이 수업의 경우 :

class Consumer<T>

타입 매개 변수 T 는 실제로 T: Any? . Null을 허용하지 않는 상한을 만들려면 명시 적으로 특정한 T: Any . 예 :

class Consumer<T: Any>

신고 사이트 변동

선언 - 사이트 차이 는 사용 사이트 차이를 한 번 및 모든 사용 사이트에 대해 선언하는 것으로 생각할 수 있습니다.

  class Consumer<in T> { fun consume(t: T) { ... } }

  fun charSequencesConsumer() : Consumer<CharSequence>() = ...

  val stringConsumer : Consumer<String> = charSequenceConsumer() // OK since in-projection
  val anyConsumer : Consumer<Any> = charSequenceConsumer() // Error, Any cannot be passed
  
  val outConsumer : Consumer<out CharSequence> = ... // Error, T is `in`-parameter

선언 - 사이트 분산의 광범위한 예는 T 가 반환 값 유형으로 만 표시되도록 불변 인 List<out T> 및 인수로 T 를받는 Comparator<in T> 입니다.

사용 사이트 차이

사용 사이트 차이 는 Java 와일드 카드와 유사합니다.

아웃 - 프로젝션 :

  val takeList : MutableList<out SomeType> = ... // Java: List<? extends SomeType>

  val takenValue : SomeType = takeList[0] // OK, since upper bound is SomeType

  takeList.add(takenValue) // Error, lower bound for generic is not specified

투영 중 :

  val putList : MutableList<in SomeType> = ... // Java: List<? super SomeType>
  
  val valueToPut : SomeType = ...
  putList.add(valueToPut) // OK, since lower bound is SomeType

  putList[0] // This expression has type Any, since no upper bound is specified

별 투영법

  val starList : MutableList<*> = ... // Java: List<?>

  starList[0] // This expression has type Any, since no upper bound is specified
  starList.add(someValue) // Error, lower bound for generic is not specified

참조 :



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow