首頁  >  問答  >  主體

java - scala builder pattern 泛型函数调用

黄舟黄舟2764 天前496

全部回覆(1)我來回復

  • 阿神

    阿神2017-04-18 10:12:09

    剛好碰到同樣的問題。
    1和2方法不知道你是怎麼做到可以正確的使用的,最簡單的辦法也要

    asInstanceOf[ManagedChannelBuilder[_]]
    

    其實

    public static ManagedChannelBuilder<?> forTarget(String target) {
        return ManagedChannelProvider.provider().builderForTarget(target);
    }
    

    回傳的是ManagedChannelBuilder[Any]。實際上這裡不應該是Any。而是一個

    T extends ManagedChannelBuilder<T>
    

    然後nameResolverFactory又把這個T回來了,作為Any。
    那麼就變成呼叫Any的build方法了,顯然這樣過不了編譯。

    希望有更好的方法~

    ================================================= ==
    更新一下

    簡化一下問題:

    class A[T <: A[T]] {
        def retA: A[_] = ???
        
        def retT: T = ???
    }
        
    class B extends A[B]
        
    (new B).retA.retT

    這是原先的定義,如果把改成這樣
    def retA: A[_ <: A[_]] = ???
    應該就沒問題了。

    因此,可以這樣

    (new B).retA.asInstanceOf[A[_ <: A[_]]].retT.retT....

    同理,返回ManagedChannelBuilder的時候就ManagedChannelBuilder<?>的时候就
    .asInstanceOf[ManagedChannelBuilder[_ <: ManagedChannelBuilder[_]]].asInstanceOf[ManagedChannelBuilder[_ <: ManagedChannelBuilder[_]]]

    回覆
    0
  • 取消回覆