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

Scala 2.10反射:为什么列表和列表元素的类型为“List()”?

发布时间:2020-12-16 10:02:31 所属栏目:安全 来源:网络整理
导读:使用 scala-2.10.0-M7,请考虑以下 Scala程序: import reflect.runtime.universe._object ScalaApplication { def main(args: Array[String]) { val list = List(42) printValueAndType(list) printValueAndType(list(0)) } def printValueAndType (thing: A
使用 scala-2.10.0-M7,请考虑以下 Scala程序:

import reflect.runtime.universe._

object ScalaApplication {
  def main(args: Array[String]) {
    val list = List(42)
    printValueAndType(list)
    printValueAndType(list(0))

  }

  def printValueAndType (thing: Any) {
    println("Value: " + thing)
    println(reflect.runtime.currentMirror.reflect(thing).symbol.toType match {case x:TypeRef => "Type: " + x.args});
  }

}

它给出了以下输出:

$scala ScalaApplication.scala 
Value: List(42)
Type: List()
Value: 42
Type: List()

为什么列表类型与列表类型(0)相同?

我本来期望类似于以下Java程序的行为:

public class JavaApplication {
    public static void main(String[] args) {

        Integer[] list = new Integer[]{42};

        printValueAndType(list);
        printValueAndType(list[0]);

    }

    public static void printValueAndType(Object o) {
        System.out.println("Value: " + o.toString());
        System.out.println("Type: " + o.getClass().getSimpleName());
    }

}

结果如下:

$java JavaApplication
Value: [Ljava.lang.Integer;@16675039
Type: Integer[]
Value: 42
Type: Integer

综上所述:
为什么list和list元素的类型都报告为List()?

解决方法

x.args为您提供该类型的类型参数.由于它们在运行时不可用,因此第一种情况下会得到一个空列表,因为Int没有任何类型参数,所以也会得到一个空列表.您可以直接打印出符号.

println(reflect.runtime.currentMirror.reflect(thing).symbol)

这产生了

Value: List(42)
class ::
Value: 42
class Integer

(编辑:李大同)

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

    推荐文章
      热点阅读