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

코딩 샘플

kotlin에서 Promise 클래스를 작성하고 싶습니다. 이 클래스는 제네릭 유형을 사용합니다. 형식은 nullable 형식 일 수도 있습니다. 소비자를 호출 할 때 유전자 유형이 nullable이면 값은 null이 될 수 있습니다. 그렇지 않은 경우 값을 개체로 설정해야합니다. kotlin 컴파일러는 다음 메시지를 표시합니다. '값'이 이번에 변경 될 수있는 변경 가능한 속성이기 때문에 'T'로 스마트 캐스트가 불가능합니다.

이 메시지가 표시되는 이유를 이해하지만 현재 값이 정확해야합니다. 이 클래스를 어떻게 컴파일 할 수 있습니까? 나는 값에 접근하려고 !! 하지만 null사용한 내 테스트 는 NPE로 실패합니다.

java.lang.NullPointerException
    at test.Promise.resolve(App.kt:20)
    at test.AppTest.testPromiseNull(AppTest.kt:31)
class Promise<R> {

    private var resolved = false

    private var value: R? = null

    var then: Consumer<R>? = null

    fun resolve(r: R) = synchronized(this) {
        if (resolved) error("Promise already resolved!")
        value = r
        resolved = true
        then?.accept(value) // Smart cast to 'T' is impossible, because 'value' is a mutable property that could have been changed by this time*
    }

    fun then(consumer: Consumer<R>) = synchronized(this) {
        if (then != null) error("Just one consumer is allowed!")
        then = consumer
        val value = value
        if (resolved) {
            consumer.accept(value) // Smart cast to 'T' is impossible, because 'value' is a mutable property that could have been changed by this time*
        }
    }
}
@Test fun testPromise() {
    val promise = Promise<String>()
    var resolved = false
    promise.then {
        assertEquals(it,  "hello" )
        resolved = true
    }
    promise.resolve("hello")
    assert(resolved)
}


@Test fun testPromiseNull() {
    val promise = Promise<String?>()
    var resolved = false
    promise.then {
        assertNull(it)
        resolved = true
    }
    promise.resolve(null)
    assert(resolved)
}

업데이트 나는 약간의 도움말 기능을 만들었습니다.

private fun <T> uncheckedCast(t: T?): T {
    @Suppress("UNCHECKED_CAST")
    return t as T
}
Tenfour04

당신을 위해 resolve기능, 당신은 이미 당신이 대신 사용할 수있는 불변의 매개 변수 값을 가지고있다.

fun resolve(r: R) = synchronized(this) {
    if (resolved) error("Promise already resolved!")
    value = r
    resolved = true
    then?.accept(r)
}

다른 경우에는 컴파일러보다 더 많이 알고 있으므로 명시 적 캐스트를 수행하고 경고를 억제 할 수 있습니다.

fun then(consumer: Consumer<R>) = synchronized(this) {
    if (then != null) error("Just one consumer is allowed!")
    then = consumer
    if (resolved) {
        @Suppress("UNCHECKED_CAST")
        consumer.accept(value as R)
    }
}

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

제네릭 형식에 대한 nullable 참조 형식을 식별하는 방법은 무엇입니까?

분류에서Dev

C # 제네릭 형식을 다른 클래스에 전달하는 방법

분류에서Dev

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

분류에서Dev

메서드의 반환 형식으로 C # 8에서 nullable 제네릭 형식을 허용하는 방법은 무엇입니까?

분류에서Dev

클래스에서 제네릭 형식을 목록으로 사용하는 방법이 있습니까?

분류에서Dev

C # 8에서 하위 클래스 제약 조건을 사용할 때 제네릭 참조 형식이 nullable이되도록 지정하는 방법은 무엇입니까?

분류에서Dev

제네릭 형식의 클래스를 반환하는 방법

분류에서Dev

TypeScript에서 제네릭 형식을 반환하는 방법

분류에서Dev

기본 클래스의 메서드를 사용하여 중첩 클래스에서 제네릭 형식을 반환하는 방법

분류에서Dev

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

분류에서Dev

C #에서 제네릭 형식 인 형식 컬렉션을 만드는 방법

분류에서Dev

다른 제네릭 기본 클래스에 C # 제네릭 형식 제약 조건을 추가하는 방법은 무엇입니까?

분류에서Dev

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

분류에서Dev

C # 제네릭에서 자식을 부모 클래스로 캐스팅하는 방법

분류에서Dev

제네릭 형식 이름을 포함하여 제네릭 메서드의 이름을 검색하는 방법

분류에서Dev

제네릭 메서드에서 제네릭 유형을 확인하는 방법

분류에서Dev

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

분류에서Dev

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

분류에서Dev

클래스 토큰을 사용하여 제네릭 유형의 중첩 제네릭을 유지하는 방법

분류에서Dev

제네릭 형식을 반환하는 제네릭 메서드를 만드는 방법

분류에서Dev

제네릭에서 서브 클래스 / 프로토콜을 강제하는 방법

분류에서Dev

제네릭에서 서브 클래스 / 프로토콜을 강제하는 방법

분류에서Dev

내부 클래스 멤버의 제네릭 형식을 참조하는 방법은 무엇입니까?

분류에서Dev

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

분류에서Dev

nullable 형식 / 필드가있는 제네릭에 대한 경고를 피하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Django : 쿼리 셋 속성이 클래스 기반 제네릭 뷰에서 작동하는 방식 이해하기

분류에서Dev

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

분류에서Dev

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

분류에서Dev

Autofac에서 클래스의 특정 구현을 제네릭에 전달하는 방법

Related 관련 기사

  1. 1

    제네릭 형식에 대한 nullable 참조 형식을 식별하는 방법은 무엇입니까?

  2. 2

    C # 제네릭 형식을 다른 클래스에 전달하는 방법

  3. 3

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

  4. 4

    메서드의 반환 형식으로 C # 8에서 nullable 제네릭 형식을 허용하는 방법은 무엇입니까?

  5. 5

    클래스에서 제네릭 형식을 목록으로 사용하는 방법이 있습니까?

  6. 6

    C # 8에서 하위 클래스 제약 조건을 사용할 때 제네릭 참조 형식이 nullable이되도록 지정하는 방법은 무엇입니까?

  7. 7

    제네릭 형식의 클래스를 반환하는 방법

  8. 8

    TypeScript에서 제네릭 형식을 반환하는 방법

  9. 9

    기본 클래스의 메서드를 사용하여 중첩 클래스에서 제네릭 형식을 반환하는 방법

  10. 10

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

  11. 11

    C #에서 제네릭 형식 인 형식 컬렉션을 만드는 방법

  12. 12

    다른 제네릭 기본 클래스에 C # 제네릭 형식 제약 조건을 추가하는 방법은 무엇입니까?

  13. 13

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

  14. 14

    C # 제네릭에서 자식을 부모 클래스로 캐스팅하는 방법

  15. 15

    제네릭 형식 이름을 포함하여 제네릭 메서드의 이름을 검색하는 방법

  16. 16

    제네릭 메서드에서 제네릭 유형을 확인하는 방법

  17. 17

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

  18. 18

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

  19. 19

    클래스 토큰을 사용하여 제네릭 유형의 중첩 제네릭을 유지하는 방법

  20. 20

    제네릭 형식을 반환하는 제네릭 메서드를 만드는 방법

  21. 21

    제네릭에서 서브 클래스 / 프로토콜을 강제하는 방법

  22. 22

    제네릭에서 서브 클래스 / 프로토콜을 강제하는 방법

  23. 23

    내부 클래스 멤버의 제네릭 형식을 참조하는 방법은 무엇입니까?

  24. 24

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

  25. 25

    nullable 형식 / 필드가있는 제네릭에 대한 경고를 피하는 가장 좋은 방법은 무엇입니까?

  26. 26

    Django : 쿼리 셋 속성이 클래스 기반 제네릭 뷰에서 작동하는 방식 이해하기

  27. 27

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

  28. 28

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

  29. 29

    Autofac에서 클래스의 특정 구현을 제네릭에 전달하는 방법

뜨겁다태그

보관