【问题标题】:In Scala, How can Manifest implicitly be caputured in context?在 Scala 中,如何在上下文中隐式捕获 Manifest?
【发布时间】:2016-10-30 08:39:12
【问题描述】:
def getManifest[T : Manifest] = implicitly[Manifest[T]]

class A[T] 
object A {
    def apply[T] = new A[T]
} 
def getA[T : A] = implicitly[A[T]] 

val m = getManifest[Int] 
//res0: Manifest[Int] = Int

val a = getA[Int]
//<console>:14: error: could not find implicit value for evidence parameter of type A[Int] 

即使上下文中没有隐式变量

通过调用getManifest[Int]Manifest[Int] 类型的m 被隐式捕获


但是我的自定义类 A,getA[Int] 发出错误

因为cotext中没有隐式变量。


A类和Manifest有什么区别

Scala 编译器是否知道 Manifest 并做一些魔术?

比如,为 Manifest 创建一些隐式变量

【问题讨论】:

    标签: scala jvm manifest


    【解决方案1】:

    简短的回答是肯定的。 Manifests 是编译器的魔法,Scala 编译器会根据需要自动为类型生成它们的隐式实例。它们用于绕过 JVM 上的类型擦除(在运行时泛型类型被擦除的问题,例如 List[Int] 看起来与 List[String] 相同)。

    更多详情请见What is a Manifest in Scala and when do you need it?

    它们现在也被弃用,取而代之的是TypeTags

    【讨论】:

    • 谢谢,您的回答很有帮助。是否可以让我的自定义类 A 像 Manifest 一样?
    • 某些用途应替换为TypeTags,其他的应替换为ClassTags。
    • @WonpyoPark,不,虽然隐式转换有可能会得到你想要的。特别是,您需要告诉编译器如何从任何类型的 T 中获取 A,其中一种方法是通过隐式转换。
    • @AlexeyRomanov 纯粹出于好奇,你有没有遇到过TypeTag 不会做而你选择ClassTag 的情况?
    • @badcook 可能最常见的是匹配case x: A(其中A 是一个类型参数)。当您在范围内有ClassTag[A] 但不适用于TypeTag[A] 时,它可以工作。此外,您通常需要ClassTag 来处理数组。
    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2019-01-10
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    相关资源
    最近更新 更多