359
|
Daniel C. Sobral · 技术社区 · 15 年前 |
1
242
Scala是用类型擦除定义的,因为Java虚拟机(JVM)与Java不同,没有得到泛型。这意味着,在运行时,只有类存在,而不存在其类型参数。在本例中,JVM知道它正在处理
幸运的是,Scala中有一个特性可以让您解决这个问题。这是最重要的 显示 . 清单是一个类,其实例是表示类型的对象。因为这些实例是对象,所以您可以传递、存储它们,并通常对它们调用方法。在隐式参数的支持下,它成为一个非常强大的工具。以下面的例子为例:
当存储一个元素时,我们也存储它的“清单”。清单是其实例表示Scala类型的类。这些对象比JVM有更多的信息,这使我们能够测试完整的参数化类型。
|
2
102
您可以使用TypeTags来实现这一点(正如Daniel已经提到的,但我将明确地说明):
您还可以使用ClassTag来实现这一点(这样您就不必依赖scala reflect):
不幸的是,它有点冗长,您需要@unchecked注释来抑制编译器警告。TypeTag将来可能会被编译器自动合并到模式匹配中: https://issues.scala-lang.org/browse/SI-6517 |
3
64
你可以使用
这个
|
4
17
这具有预期的输出,并将case类的内容限制为所需的类型String list。 |
5
13
有一种方法可以克服Scala中的类型擦除问题。在里面 Overcoming Type Erasure in matching 1 和 Overcoming Type Erasure in Matching 2 (Variance) |
6
11
我找到了一个稍微好一点的解决方法,解决了这一令人敬畏的语言的局限性。 在Scala中,数组不会出现类型擦除问题。我认为用一个例子来说明这一点比较容易。
假设我们有一份
要解决此问题,请首先创建一个案例类:
然后在模式匹配中执行以下操作:
这将需要在代码中做一些小的更改来处理数组而不是列表,但这不应该是一个大问题。
注意,使用
|
7
6
因为Java不知道实际的元素类型,所以我发现只使用
|
8
4
我想知道这是否是一个合适的解决方法:
它与“空列表”的情况不匹配,但它给出了一个编译错误,而不是警告!
是不是更好,还是我没有抓住重点? |
9
1
这不是一个解决方案,而是一种生活方式,而不必彻底掩盖它:
|
10
0
我想添加一个答案,将问题概括为:如何在运行时获取列表类型的字符串表示
|
11
-20
使用模式匹配保护
|
davidzxc574 · 将字符串缩放为字符 2 年前 |
yic_l · 什么是“!”在这个函数中是什么意思? 2 年前 |
Jelly · Scala:用于理解递归未来 2 年前 |
bbgghh · 在scala中连接两个列表时如何处理不匹配的键 2 年前 |
Iheb Mar · 卡夫卡制作人/消费者粉碎每一秒的API调用 2 年前 |
B. Bal · 在Scala中重用类成员 2 年前 |