Kotlin

제네릭 클래스 자료형 변환

lwndnjs93 2020. 4. 14. 21:38

상속을 사용하는 경우 클래스의 선언 형태에 따라, 클래스의 자료형 변환이 가능하지만

제네릭 클래스는 가변성을 지정하지 않으면, 형식 매개변수에

부모자식 클래스가 지정되어도 형 변환이 불가능하다

 

Parent클래스가 부모 부모 클래스로 사용이 가능하며, Child클래스는 Parent클래스를 상속받는다

Parent타입의 obj1에는 Child클래스로 타입 변환이 가능하다

하지만 Child 타입의 obj2처럼 반대로 타입 변환이 불가능하여 오류가 난다

제네릭 클래스에는 형식 매개변수인 T에 부모 자식 클래스를 지정하더라도

서로 관련이 없는 타입이 되기 때문에 obj3, obj4에서는 타입이 일치하지 않는다

obj5는 Child 타입이기때문에 동일한 타입인 obj6에 할당이 가능하다

 

부모자식 클래스를 형식 매개변수에 지정하여 서로 변환이 가능하게 하기 위해서는

제네릭의 가변성을 주기 위해 in, out을 사용해야한다

 

제네릭의 형식 매개변수는 기본적으로 null이 허용된다

그렇기 때문에 제네릭 클래스의 객체를 생성할때 null을 허용할 형식 매개변수 위치에 ? 를 사용하였고

형식 매개변수를 사용하는 info함수 내에서는 ?.equals() 를 사용하여 null인 경우 null을 반환하게 하였다

만약 형식 매개변수에서 null을 허용하지 않을 경우 해당 매개변수를 Any형으로 제한을 하면 된다

Any는 말 그대로 null이 아닌 Any 타입 이기때문에 null이 들어올수 없다