Kotlin에서 제네릭 클래스를 동일한 클래스의 제네릭 배열에 매핑하는 방법

Simon

Kotlin에서 제네릭 클래스를 동일한 유형의 제네릭 배열에 매핑하는 방법이 궁금합니다.

다음 수업이 주어집니다.

class <T> MyClass(val type : Class<T>) {
  fun new() = type.newInstance()
}

나는 다음과 같은 것을 갖고 싶다.

class MyOtherClass {
  val map = Map<Class<T>, MyClass<T>>

  inline fun <reified T> get() : MyClass<T> {
    if(T::class.java in map) {
      return map[T::class.java]
    } else {
      val newInstance = MyClass(T::class.java)
      map[T::class.java] = newInstance
      return newInstance
    }
  }
}

그러나 다음과 같은 이유로 작동하지 않습니다.

  • T는 MyOtherClass에서 사용할 수 없습니다.
  • MyOtherClass에서 T를 Any로 변경하면 Any가 필요하지만 T가 있다는 유형 추론 오류가 발생합니다.
  • out으로 변경해도 작동하지 않습니다.
  • 로 변경하면 작동하지만 'return map [T :: class.java]'가 확인되지 않은 캐스트라는 경고를 표시합니다.

나는 어떻게 그리고 당신이 그것을 쓸 수 있는지 모르겠지만 논리적 관점에서 나는 다음을 달성하고 싶습니다.

  • 주어진 유형에 대해 특정 작업을 수행하는 일반 관리자 클래스가 있습니다 (= 위의 MyClass).
  • 유형별로 이러한 관리자 클래스를 캐시하는 다른 클래스가 있습니다. 주어진 유형의 관리자가있는 경우 새 관리자를 만드는 대신 해당 관리자를 사용해야합니다.
  • 따라서 동일한 유형의 관리자에 유형을 매핑하고 싶습니다.

언급했듯이 다음과 같은 작성 방법이 있지만 맵이 컴파일러에게 X 유형의 항목을 가져 오면 MyClass가 반환된다는 것을 알려야하기 때문에 캐스팅 경고를 피하고 싶습니다. X를 입력합니다.

class MyOtherClass {
  val map = Map<Class<out Any>, MyClass<out Any>>

  inline fun <reified T:Any> get() : MyClass<T> {
    if(T::class.java in map) {
      return map[T::class.java] as MyClass<T>
    } else {
      val newInstance = MyClass(T::class.java)
      map[T::class.java] = newInstance
      return newInstance
    }
  }
}

도와 주셔서 감사합니다!

Simon

Lino와 오프닝 포스트에서 언급했듯이 Something에 대한 일반 정보 T가 손실되기 때문에 경고 없이는 불가능합니다.

또한 *는 Kotlin에서 와일드 카드로 사용할 수 있으므로 다음 접근 방식이 작동합니다 (실제 코드에서 가져옴).

inline fun <reified T> componentManager(): ComponentManager<T> = componentManager(T::class.java)

    @Suppress("UNCHECKED_CAST")
    fun <T> componentManager(type: Class<T>): ComponentManager<T> {
        return when {
            componentManagers.containsKey(type) -> {
                componentManagers[type] as ComponentManager<T>
            }
            else -> {
                val manager = ComponentManager(initialEntityCapacity, type)
                addListener(manager)
                componentManagers.put(type, manager)
                manager
            }
        }
    }

리노 덕분에!

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

런타임에 제네릭 클래스에 대한 TypeTag를 얻는 방법

분류에서Dev

매개 변수가 클래스의 매개 변수와 동일한 제네릭에 클래스 매핑

분류에서Dev

스칼라에서 제한된 제네릭 클래스를 작성하는 방법

분류에서Dev

C #의 제네릭 클래스 내에서 제네릭 클래스의 개체를 사용하는 방법은 무엇입니까?

분류에서Dev

제네릭 유형의 클래스를 얻는 방법은 동일한 제네릭 유형으로 다른 배열을 허용합니까?

분류에서Dev

제네릭 클래스에서 Iterable <> 메서드를 구현하는 방법

분류에서Dev

Typescript : 가장 안전한 방법으로 열거 형을 유형에 매핑하는 제네릭 클래스 팩토리를 어떻게 선언합니까?

분류에서Dev

스위프트에서 수퍼 클래스가 제네릭 클래스 일 때 수퍼 클래스를 상속하는 방법

분류에서Dev

C ++에서 제네릭 기본 클래스를 초기화하는 방법

분류에서Dev

C #에서 제네릭 형식과 클래스를 비교하는 방법

분류에서Dev

제네릭 클래스에서 작동하지 않는 함수

분류에서Dev

C # 메서드에서 제네릭 클래스 참조를 얻는 방법

분류에서Dev

개체를 하위 클래스에 대한 제네릭 형식으로 캐스팅하는 방법?

분류에서Dev

main.cpp의 제네릭 클래스에 대한 operator> 오버로드 방법

분류에서Dev

추상 제네릭 클래스에서 파생 된 클래스가 자신을 제네릭 매개 변수로 사용하는지 확인하는 방법

분류에서Dev

클래스 계층 구조에서 Kotlin 제네릭 불일치

분류에서Dev

JAVA의 제네릭 클래스에서 오버라이드 메서드를 사용하는 방법

분류에서Dev

제네릭 클래스에서 nullable 형식을 처리하는 방법

분류에서Dev

인수 필요 클래스에서 제네릭을 사용하는 방법

분류에서Dev

Spring RestTemplate : 제네릭 클래스에서 매개 변수 유형을 정의하는 방법

분류에서Dev

Java의 제네릭 유형에서 클래스를 유추하는 방법은 무엇입니까?

분류에서Dev

Java의 제네릭 유형에서 클래스를 유추하는 방법은 무엇입니까?

분류에서Dev

어떻게 충족 컴파일러에 자바 제네릭 클래스에서 클래스를 추출하는?

분류에서Dev

C #으로 제네릭 클래스의 동적 클래스 속성에 액세스하는 방법은 무엇입니까?

분류에서Dev

클래스가 다른 유사한 메서드에 제네릭을 사용하는 방법

분류에서Dev

추상 제네릭 클래스에 대해 IncludeBase가 실패한 Automapper 매핑

분류에서Dev

하나의 클래스에서만 제네릭 유형 설정

분류에서Dev

TypeScript에서 클래스 제네릭을 선택적으로 만드는 방법

분류에서Dev

Scala에서 Java 제네릭 내부 클래스를 인스턴스화하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    런타임에 제네릭 클래스에 대한 TypeTag를 얻는 방법

  2. 2

    매개 변수가 클래스의 매개 변수와 동일한 제네릭에 클래스 매핑

  3. 3

    스칼라에서 제한된 제네릭 클래스를 작성하는 방법

  4. 4

    C #의 제네릭 클래스 내에서 제네릭 클래스의 개체를 사용하는 방법은 무엇입니까?

  5. 5

    제네릭 유형의 클래스를 얻는 방법은 동일한 제네릭 유형으로 다른 배열을 허용합니까?

  6. 6

    제네릭 클래스에서 Iterable <> 메서드를 구현하는 방법

  7. 7

    Typescript : 가장 안전한 방법으로 열거 형을 유형에 매핑하는 제네릭 클래스 팩토리를 어떻게 선언합니까?

  8. 8

    스위프트에서 수퍼 클래스가 제네릭 클래스 일 때 수퍼 클래스를 상속하는 방법

  9. 9

    C ++에서 제네릭 기본 클래스를 초기화하는 방법

  10. 10

    C #에서 제네릭 형식과 클래스를 비교하는 방법

  11. 11

    제네릭 클래스에서 작동하지 않는 함수

  12. 12

    C # 메서드에서 제네릭 클래스 참조를 얻는 방법

  13. 13

    개체를 하위 클래스에 대한 제네릭 형식으로 캐스팅하는 방법?

  14. 14

    main.cpp의 제네릭 클래스에 대한 operator> 오버로드 방법

  15. 15

    추상 제네릭 클래스에서 파생 된 클래스가 자신을 제네릭 매개 변수로 사용하는지 확인하는 방법

  16. 16

    클래스 계층 구조에서 Kotlin 제네릭 불일치

  17. 17

    JAVA의 제네릭 클래스에서 오버라이드 메서드를 사용하는 방법

  18. 18

    제네릭 클래스에서 nullable 형식을 처리하는 방법

  19. 19

    인수 필요 클래스에서 제네릭을 사용하는 방법

  20. 20

    Spring RestTemplate : 제네릭 클래스에서 매개 변수 유형을 정의하는 방법

  21. 21

    Java의 제네릭 유형에서 클래스를 유추하는 방법은 무엇입니까?

  22. 22

    Java의 제네릭 유형에서 클래스를 유추하는 방법은 무엇입니까?

  23. 23

    어떻게 충족 컴파일러에 자바 제네릭 클래스에서 클래스를 추출하는?

  24. 24

    C #으로 제네릭 클래스의 동적 클래스 속성에 액세스하는 방법은 무엇입니까?

  25. 25

    클래스가 다른 유사한 메서드에 제네릭을 사용하는 방법

  26. 26

    추상 제네릭 클래스에 대해 IncludeBase가 실패한 Automapper 매핑

  27. 27

    하나의 클래스에서만 제네릭 유형 설정

  28. 28

    TypeScript에서 클래스 제네릭을 선택적으로 만드는 방법

  29. 29

    Scala에서 Java 제네릭 내부 클래스를 인스턴스화하는 방법은 무엇입니까?

뜨겁다태그

보관