공변성, 반공변성, 무변성
글로만 읽으면 어떤 의미 인지 몰랐는데 좀 이해가 간다.
일단 클래스 관계를 먼저 보면 Nothing -> Int -> Any 이렇게로 오른쪽으로 갈 수록 다 상위 클래스다.
먼저 무변성
class Box<T>(val size :Int)
fun main(){
val anys:Box<Any> = Box<Int>(10) // 오류 자료형 불일치
val nothings:Box<Nothin> = Box<Int>(10) // 오류 자료형 불일치
}
out 과 in이 없는 거다 위처럼 아에 관계가 없는 무변성
공변성은
class Box<out T>(val size :Int)
fun main(){
val anys:Box<Any> = Box<Int>(10) // 관계 성립으로 객체 생성 가능
val nothings:Box<Nothin> = Box<Int>(10) // 오류 자료형 불일치
}
out T니까 T 밖에서 가능하다 즉 T 밑에 있는 자료형도 가능하다 뭐 이런식으로 이해하면 되는건가?
+추가 : out은 반환형 자료형에만 사용이 가능하다. 즉
fun set(new:T){
~~
} 이런 자료형에는 사용불가! 아 그리고 매개변수에 var는 사용 못 함! val을 사용해야한다.
var을 사용하기 위해서는 private를 붙여서 사용!
out T하게되면 자신보다 하위 클래스도 가능하게 된다.
class Box<In T>(val size :Int)
fun main(){
val anys:Box<Any> = Box<Int>(10) // 오류 자료형 불일치
val nothings:Box<Nothin> = Box<Int>(10) // 관계 성립으로 객체 생성 가능
}
In은 그 반대겠지 상위 클래스를 사용할 수 있게 된다.
추가할 내용들이 생기면 추가해야지
댓글 영역