Written on
·
54
0
저같은 경우, 7:32 부분에서 List<GoldFish> 를 저장했다가 List<Carp> 타입을 꺼내려고 하면
"class generic.GoldFish cannot be cast to class generic.Carp (generic.GoldFish and generic.Carp are in unnamed module of loader 'app')" 와 같은 오류가 발생하는데,
정상적으로 금붕어 리스트가 반환되는게 맞는지요 ? 제가 뭔가 놓친 부분이 있을까 궁금하여 문의 드립니다.
샘플코드는 다음과 같습니다.
package reflection
import generic.Carp
import generic.GoldFish
import kotlin.reflect.KClass
import kotlin.reflect.full.cast
class TypeSafeCage {
val animals: MutableMap<KClass<*>, Any> = mutableMapOf()
inline fun <reified T : Any> getOne(): T {
return T::class.cast(animals[T::class])
}
inline fun <reified T : Any> putOne(animal: T) {
animals[T::class] = T::class.cast(animal)
}
}
fun main() {
val cage = TypeSafeCage()
cage.putOne(listOf(GoldFish("금붕어1"), GoldFish("금붕어2")))
cage.getOne<List<Carp>>().forEach { println(it::class.simpleName) }
}
// 다른 패키지 파일
package generic
open class Animal(
val name: String
)
open class Fish(name: String) : Animal(name)
class GoldFish(name: String) : Fish(name)
class Carp(name: String) : Fish(name)
강의 중 영상 캡쳐 화면
Answer 2
0
안녕하세요! Teddy님~ 🙂 질문 주셔서 감사합니다!!
"class generic.GoldFish cannot be cast to class generic.Carp (generic.GoldFish and generic.Carp are in unnamed module of loader 'app')" 와 같은 오류가 발생하는데,
정상적으로 금붕어 리스트가 반환되는게 맞는지요 ? 제가 뭔가 놓친 부분이 있을까 궁금하여 문의 드립니다.
로 문의 주신 내용이 핵심 같은데요..! 금붕어가 들어 있는데 List<Carp>
로 타입을 받기 때문에 금붕어가 반환 되려다가 에러가 나오게 됩니다!
즉, 정상적으로 라는 단어가
putOne으로 금붕어를 넣었으니 꺼낼 때도 금붕어다
라는 관점에서 맞기도 하고요
금붕어를 꺼냈으나 잉어로 형변환을 하려고 해 오류가 발생했다
라는 관점에서는 아니기도 할 것 같습니다.
감사합니다. 🙇
0
안녕하세요, 인프런 AI 인턴입니다. 성태혁님, 코틀린 강의에서 발생한 문제에 대해 문의 주셔서 감사합니다.
질문 내용을 확인해보니, “금붕어 리스트가 반환되어야 하는데 잉어 리스트로 가져오려 할 때 발생하는 오류”에 대한 부분을 설명 드리겠습니다. TypeSafeCage의 구조상, 저장된 객체와 꺼내려는 객체의 타입이 일치하지 않으면 해당 오류가 발생하는 게 정상입니다.
즉, 안전한 타입 이종 컨테이너를 사용하여 데이터 타입을 제어하려고 하지만, 컨테이너에서 다른 타입으로 데이터를 꺼내려고 할 때 변환이 불가능한 상황입니다.
주요원인:
- putOne
메서드를 통해 GoldFish
리스트를 저장한 후, getOne
을 통해 Carp
타입으로 리스트를 꺼내려고 시도하기 때문에 타입 불일치가 발생합니다. KClass<*>
를 키로 사용할 때, 실제로 저장된 타입을 명확하게 지정할 필요가 있습니다.
강의 캡처 화면에 나와 있듯이, List<Carp>
에는 금붕어
가 저장되어 있다는 점을 보여주며, 이 컨텍스트에서는 코틀린이 타입 안전성을 보장하지 않는 상황을 주의해야 한다는 교육적 목적을 염두에 두신 것 같습니다.
이러한 타입 불일치 문제는 타입 캐스팅을 신중히 활용하여 해결할 수 있습니다. 만약 구조적으로 다양한 타입의 데이터가 저장되어야 하는 상황이라면, 다른 방법을 고려해야 합니다. 예를 들어, 저장과 가져오는 로직을 명확하게 타입별로 분리해서 관리하거나, 범용적으로 처리할 수 있는 인터페이스를 도입하는 방식 등을요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.