加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

泛型 – 方法调用的默认类型

发布时间:2020-12-16 18:02:42 所属栏目:安全 来源:网络整理
导读:我想知道在 Scala中调用类型参数化方法时是否可以使用默认类型.假设我在某处有以下方法: def apply[A]( id: String )( implicit processor: Processor[A] ) = processor( data get id ) 当编译器没有关于要推断的类型的提示时,我希望A成为String.所以我可以
我想知道在 Scala中调用类型参数化方法时是否可以使用默认类型.假设我在某处有以下方法:

def apply[A]( id: String )( implicit processor: Processor[A] ) =
  processor( data get id )

当编译器没有关于要推断的类型的提示时,我希望A成为String.所以我可以重载我的定义:

def apply( id: String )( implicit processor: Processor[String] ) =
  processor( data get id )

但是这两种方法在擦除后都会有相同的签名…有没有办法提供默认类型?

解决方法

您可以通过定义以下幻像类型来实现此目的:

sealed class DefaultsTo[A,B]
trait LowPriorityDefaultsTo {
   implicit def overrideDefault[A,B] = new DefaultsTo[A,B]
}
object DefaultsTo extends LowPriorityDefaultsTo {
   implicit def default[B] = new DefaultsTo[B,B]
}

然后你的方法可以编写

def apply[A]( id: String )( implicit e: A DefaultsTo String,processor: Processor[A] ) =
   processor( data get id )

overrideDefault的定义保证了对于任何两个指定类型A和B,编译器总是可以提供DefaultsTo [A,B]类型的对象(例如DefaultsTo [Int,String]).但是,如果两种类型中的一种未指定(例如DefaultsTo [A,String]),编译器将更喜欢识别这两种类型(在示例中提供DefaultsTo [String,String],从而推断未指定的String A)型.

作为Naftoli Gugenheim pointed out in this mailing list thread,您还可以使用一些很好的语法来使用上下文边界:

class Has[B] {
   type AsDefault[A] = A DefaultsTo B
}

def apply[A : Has[String]#AsDefault : Processor](id: String) =
   implicitly[Processor[A]].apply(data get id)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读