在Scala中有一种很好的方法可以在List [Int]和java.util.List [java.lang.Integer]之间进行转换吗?
我正在与Java(Thrift)接口.
JavaConversions支持List - > java.util.List,并且Int - > java.lang.Integer之间存在implicits,但是我可以告诉我仍然需要额外的传递来手动进行转换.
val y = List(1)
val z: java.util.List[Integer] = asList(y) map { (x: Int) => x : java.lang.Integer }
Run Code Online (Sandbox Code Playgroud) 我想编写一个转换为类型A的函数,其中A可以是例如List [Int],或者更复杂的参数化类型,如Map [Int,List [Int]].
def castToType[A](x: Any): A = {
// throws if A is not the right type
x.asInstanceOf[A]
}
Run Code Online (Sandbox Code Playgroud)
现在,由于类型擦除(我相信),即使类型不正确,代码也会愉快地工作.该错误仅在访问时显示,具有ClassCastException.
val x = List(1, 2, 3)
val y = castToType[List[String]](x)
y(0) --> throws java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
Run Code Online (Sandbox Code Playgroud)
有没有办法可以使用清单来使这项工作正常进行?谢谢!
有没有办法确定给定对象是枚举值?
x.isInstanceOf[Enumeration.$Value] 似乎不起作用,从我对路径依赖类型的理解,不应该.
我想写一个给出任何Enumeration值的函数,返回它的id.或者,将Enumeration转换为Int的隐式也很棒.
我已经阅读了多个样式指南和其他资源,说明在方法/变量/其他名称中使用下划线是个坏主意.
这背后的技术原因是什么?
我非常习惯于用_前置辅助函数.还有一些我应该公开的私有函数,所以我可以通过REPL访问它们.其他命名约定,比如使用"helper"后缀似乎很麻烦.
任何想法将不胜感激!
有没有办法禁止参数化类型被特定类型参数化?
例如假设我想创建自己的专用List [T]类型,我不希望List [Nothing]合法,即导致编译错误.
我正在寻找一种方法来使以下错误更容易被捕获(是的,我知道这不是非常实用或伟大的Scala):
val x = ListBuffer()
x += 2
Run Code Online (Sandbox Code Playgroud)
x的类型为ListBuffer [Nothing].
我有一些代码具有不变量,即必须在最终使用的函数中构造对象(由于与全局状态相关的各种原因,这些原因并不理想但是是假设的一部分).
例如,假设下面的函数boo负责操作moo.
def boo(mooGen: () => Moo) {
val m = mooGen() // a new MOO must be created HERE
m.moo()
}
Run Code Online (Sandbox Code Playgroud)
想要使用boo的boo客户端必须传入一种类型为()=> Moo,其中函数生成所需的Moo.
理想的客户行为:
boo( () => new Moo(// specific parameters here) )
Run Code Online (Sandbox Code Playgroud)
直到嘘声内部才会创建Moo.
但是,客户端可以使用以下代码轻松地错过:
val myMoo = new Moo(// specific parameters here)
boo( () => myMoo)
Run Code Online (Sandbox Code Playgroud)
这打破了我们希望moo结构仅在boo中发生的不变量.
所以基本上,我想确定是否在函数的调用堆栈中创建了mooGen的返回值,或者是否是事先创建的.
有许多方法可以在运行时验证这一点.但是,有没有办法在编译时强制使用这种模式?使用implicits或其他任何聪明的东西?
任何想法都表示赞赏!
给定一个Scala AST,有没有办法生成Scala源代码?
我正在研究通过解析/分析其他Scala源来自动生成Scala源的方法.任何提示将不胜感激!
我正在寻找一种方法来定义一个返回类型T的方法,其中T =子类的类型.
我知道我可以使用抽象类型来做这件事,但不喜欢为每个子类重新定义T的开销.
一些示例代码:
object Helper {
def help[A <: MyClass](cls: A): Option[A] = { cls.foo() map { _.asInstanceOf[A] } }
}
class MyClass {
type T <: MyClass
def foo(): Option[T] = Some(this.asInstanceOf[T])
}
class ChildClass extends MyClass {
type T = ChildClass
}
Run Code Online (Sandbox Code Playgroud)
可能新的语言功能使这更容易?或者我可以用某种方式使用this.type吗?对我来说很重要的是我能够定义一个可以用这种方式调用foo的辅助类.
我编写了以下函数来检查给定的单例类是否实现了特征.
/** Given a singleton class, returns singleton object if cls implements T.
* Else returns None. */
def maybeMakeSingletonObj[T: ClassManifest](cls: Class[_]): Option[T] = {
try {
val m = classManifest[T]
val obj = cls.getField("MODULE$").get(m.erasure).asInstanceOf[AnyRef]
if (Manifest.singleType(obj) <:< m) Some(obj.asInstanceOf[T])
else None
} catch {
case e: Exception => None
}
}
Run Code Online (Sandbox Code Playgroud)
此代码适用于以下示例:
trait A
object B extends A
assert(maybeMakeSingletonObj[A](B.getClass()) === Some(B))
Run Code Online (Sandbox Code Playgroud)
但是,在以下示例中失败:
trait A[T, R]
object B extends A[Int, Int]
assert(maybeMakeSingletonObj[A[_,_]](B.getClass()) === Some(B))
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?