使用类型参数进行类型转换

芬恩

Given是一个Java方法,它java.lang.Object为给定的字符串返回我想将此方法包装在Scala方法中,该方法将返回的实例转换为某种类型T如果转换失败,则该方法应返回None我正在寻找类似的东西:

def convert[T](key: String): Option[T] = {
  val obj = someJavaMethod(key)
  // return Some(obj) if obj is of type T, otherwise None
}

convert[Int]("keyToSomeInt") // yields Some(1)
convert[String]("keyToSomeInt") // yields None

(如何)可以使用Scala的反射API来实现?我很清楚,convert可能必须更改的签名

古拉萨玛

那是ClassTag如果的话:

import reflect.ClassTag

def convert[T : ClassTag](key: String): Option[T] = {
  val ct = implicitly[ClassTag[T]]
  someJavaMethod(key) match {
    case ct(x) => Some(x)
    case _ => None
  }
}

它可以用作提取器,以同时测试并转换为正确的类型。

例子:

scala> def someJavaMethod(s: String): AnyRef = "e"
someJavaMethod: (s: String)AnyRef

[...]

scala> convert[Int]("key")
res4: Option[Int] = None

scala> convert[String]("key")
res5: Option[String] = Some(e)

编辑:注意然而,一个ClassTag自动拆箱装箱元。因此,例如,convert[Int]("a")它将永远无法工作,因为java方法返回AnyRefconvert[java.lang.Integer]("a")对于其他原始类型,它必须为,依此类推。

Miles的回答Typeable似乎可以自动处理那些极端情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Type类型的参数进行转换

来自分类Dev

使用类型为Type的参数进行转换

来自分类Dev

使用宏进行不兼容的参数类型转换

来自分类Dev

使用类型变量进行转换

来自分类Dev

使用对象进行类型转换

来自分类Dev

使用类型参数动态转换对象

来自分类Dev

使用反射根据参数类型转换值

来自分类Dev

使用反射根据参数类型转换值

来自分类Dev

使用通用类型参数进行播放写入

来自分类Dev

使用float_of_int进行类型转换

来自分类Dev

使用float_of_int进行类型转换

来自分类Dev

使用C语言进行类型转换

来自分类Dev

在 C 中使用指针进行类型转换

来自分类Dev

使用 asInstanceOf Scala 进行类型转换后类型错误

来自分类Dev

有什么方法可以避免在使用泛型参数调用方法时进行类型转换?

来自分类Dev

类型转换函数的参数

来自分类Dev

保存命令行参数并进行类型转换

来自分类Dev

传递方法参数时自动进行类型转换

来自分类Dev

C ++使用函数参数类型进行模板参数推导

来自分类Dev

使用类型参数对类型进行子类化,并在新类中将类型参数替换为静态类型

来自分类Dev

类型错误:在使用 MySQL 进行字符串格式化期间并非所有参数都被转换

来自分类Dev

编写函数进行类型转换

来自分类Dev

迅速进行类型转换的困惑

来自分类Dev

从AnyObject进行Swift类型转换

来自分类Dev

interface {}进行函数类型转换

来自分类Dev

在Haskell中进行类型转换

来自分类Dev

在malloc中进行类型转换

来自分类Dev

如何使用可变参数模板转换每种变体类型

来自分类Dev

使用存储在参数中的类型转换对象