scala builder pattern 泛型函数调用

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中是否可以这样,语法是什么样子的?


紫衣仙女
浏览 450回答 1
1回答

芜湖不芜

刚好碰到同样的问题。1和2方法不知道你是怎么做到可以正确的使用的,最简单的办法也要asInstanceOf[ManagedChannelBuilder[_]]实际上public static ManagedChannelBuilder<?> forTarget(String target) {&nbsp; &nbsp; return ManagedChannelProvider.provider().builderForTarget(target);}返回的是ManagedChannelBuilder[Any]。实际上这里不应该是Any。而是一个T extends ManagedChannelBuilder<T>然后nameResolverFactory又把这个T返回了,作为Any。那么就变成调用Any的build方法了,显然这样过不了编译。希望有更好的方法~===================================================更新一下简化一下问题:class A[T <: A[T]] {&nbsp; &nbsp; def retA: A[_] = ???&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; def retT: T = ???}&nbsp; &nbsp;&nbsp;class B extends A[B]&nbsp; &nbsp;&nbsp;(new B).retA.retT这是原先的定义,如果把改成这样def retA: A[_ <: A[_]] = ???应该就没问题了。因此,可以这样(new B).retA.asInstanceOf[A[_ <: A[_]]].retT.retT....同理,返回ManagedChannelBuilder<?>的时候就.asInstanceOf[ManagedChannelBuilder[_ <: ManagedChannelBuilder[_]]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java