>

내가 관리하고있는 코드에서이 클래스를 만났다 :

new GenericFutureListener<Future<? super Void>>() {...}

이것이 무엇을 의미하는지 이해하는데 정말 어려움을 겪고 있습니다. Future   Void 유형을 포함  또는 수퍼 클래스- Object . 왜 그냥 Future<Object> 를 쓰지 않습니까? ?

  • 답변 # 1

    GenericFutureListener<Future<? super T>> 와 같은 일반적인 유형을 따르기 위해 생성 된 것 같습니다. GenericFutureListener<Future<Void>> 를 사용할 수있을만큼 유연하지 않습니다.  혼자.

    예를 들어 다음과 같은 것이 있다면 :

    class GenericFutureListener<T> {}
    public static <T> void m(GenericFutureListener<Future<? super T>> p) {
        ...
    }
    
    

    m(new GenericFutureListener<Future<? super Void>>() {}); // works,
    m(new GenericFutureListener<Future<Void>>() {}); // does not work
    
    

    단지 GenericFutureListener<Future<Void>> 에 전달  허용되지 않습니다.

  • 답변 # 2

    아무도 지적하지 않은 사람은 Netty이며 https://netty.io/4.0/api/io/netty/util/concurrent/class-use/Future를 보면 .html 라이브러리에서 이러한 유형을 취하는 몇 가지 방법이 있습니다. 와이즈 비즈 . 그리고 이러한 메소드에는 일반적인 경우 때문에이 서명이 있습니다. ChannelPromise.addListener(GenericFutureListener<? extends Future<? super java.lang.Void>> listener) . 와이즈 비즈  단지 Future.addListener(GenericFutureListener<? extends Future<? super V>> listener) 를 확장 .

    일반적인 경우는 1이기 때문에 의미가 있습니다. , 그것은 어떤 ChannelPromise 를 처리 할 수 ​​있습니다  미래가 완료되면 가치;2. Future<Void> 이후   FutureListener<Future<Object>> 입니다  그것은 Object 를 처리 할 수 ​​있습니다 . 따라서 그것은 V 를들을 수 있습니다 . 분명히 Object 의 모든 수퍼 타입에 대해서도 마찬가지입니다.   V 대신 .

    물론 자바가 선언-사이트 차이를 가지고 있다면이 서명은 훨씬 더 단순 할 것입니다. 그러나 곧 그렇게되지는 않을 것입니다.

  • 답변 # 3

    알다시피,이 Future<V>  공허의 미래 일 수도 있고, V 일 수도 있습니다.  미래.

    그러나 :

    와이즈 비즈

    개발자의 의도는 "리스너"가 액션을 무효로하는 것을 거의 확실하게 제한하는 것이었다. 그러나 Object 를 허용한다면 그런 다음 다른 유형을 Future<? super Void> 로 사용할 수 있습니다. Object 때문에  

    So why not just write Future?

    를 개최 할 수  (또는 다른 유형) 결과.

    Future<Object>   Future 되고  클래스는 자식 클래스를 허용하지 않습니다.이 클래스는 Future<Object> 를 호출하는 데 실질적인 가치가 없다면 무효화 조치로 거의 완전히 제한합니다.  미래의 결과를 설정할 때)

  • 답변 # 4

    예, String 를 사용할 수 있습니다  리스너를 사용하지만리스너가 결과를 사용하지 않아야한다는 것을 선언합니다.

    이것을 pyzwyz로 선언  리스너가 결과로 무언가를 수행한다는 인상을줍니다.

  • 답변 # 5

    때때로 우리는 작업의 수행 여부에만 관심을 갖습니다.

    나 같은 사람은 java.lang.Void 를 반환하는 것을 선호 할 수 있습니다  작업 결과가 없음을 나타냅니다.

    다른 사람이 final 를 사용하는 것을 선호 할 수 있지만  또는 new Object()   Future<Object> 를 사용하십시오.  결과적으로.

    이 남자는 둘 다 GenericFutureListener<Future<Object>> 를 만났다  그리고 Future<Void> . 그래서 그는 Future<Object> 를 사용합니다  두 가지를 모두 적용 할 수 있습니다.

    Future<?>

  • 이전 reactjs - 구성 파일을 사용하여 반응 기본 스타일의 동적 스타일링
  • 다음 로컬 컴퓨터 설정에 Docker가없는 Hyperledger Fabric