首页  >  问答  >  正文

java - scala builder pattern 泛型函数调用

黄舟黄舟2764 天前494

全部回复(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[_]] = ???def retA: A[_ <: A[_]] = ???
    应该就没问题了。

    因此,可以这样

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

    同理,返回ManagedChannelBuilder<?>的时候就
    .asInstanceOf[ManagedChannelBuilder[_ <: ManagedChannelBuilder[_]]]应该就没问题了。

    🎜因此,可以这样🎜 rrreee 🎜同理,返回ManagedChannelBuilder<?>的时候就🎜.asInstanceOf[ManagedChannelBuilder[_ <: ManagedChannelBuilder[_]]]🎜

    回复
    0
  • 取消回复