为了账号安全,请及时绑定邮箱和手机立即绑定

scala builder pattern 泛型函数调用

scala builder pattern 泛型函数调用

紫衣仙女 2019-03-20 14:15:42
public abstract class ManagedChannelBuilder<T extends ManagedChannelBuilder<T>> {    // ...}目前有这样一个泛型类,泛型类型是继承自ManagedChannelBuilder的。1 普通方式调用val builder = ManagedChannelBuilder.forTarget("");builder.nameResolverFactory(new DnsNameResolverProvider)builder.build()2 强制类型转换调用val managedChannel = ManagedChannelBuilder.forTarget("")    .nameResolverFactory(new DnsNameResolverProvider())    .asInstanceOf[ManagedChannelBuilder].build();目前上面2种方式虽然是可以正确的调用方法,但是我期望能够通过下面这种直接.的方式来调用而不需要强制类型转换。val managedChannel = ManagedChannelBuilder.forTarget("")    .nameResolverFactory(new DnsNameResolverProvider()).build()不知道在scala中是否可以这样,语法是什么样子的?
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

刚好碰到同样的问题。

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<?>的时候就

.asInstanceOf[ManagedChannelBuilder[_ <: ManagedChannelBuilder[_]]]


查看完整回答
反对 回复 2019-04-25
  • 1 回答
  • 0 关注
  • 449 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信