小编Pan*_*Lee的帖子

Scala将List [Int]转换为java.util.List [java.lang.Integer]

在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)

scala scala-java-interop

35
推荐指数
2
解决办法
1万
查看次数

带参数化类型的Scala asInstanceOf

我想编写一个转换为类型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)

有没有办法可以使用清单来使这项工作正常进行?谢谢!

scala

30
推荐指数
3
解决办法
4万
查看次数

Scala枚举为int

有没有办法确定给定对象是枚举值?

x.isInstanceOf[Enumeration.$Value] 似乎不起作用,从我对路径依赖类型的理解,不应该.

我想写一个给出任何Enumeration值的函数,返回它的id.或者,将Enumeration转换为Int的隐式也很棒.

scala

14
推荐指数
2
解决办法
6239
查看次数

Scala在名字中强调了一下

我已经阅读了多个样式指南和其他资源,说明在方法/变量/其他名称中使用下划线是个坏主意.

这背后的技术原因是什么?

我非常习惯于用_前置辅助函数.还有一些我应该公开的私有函数,所以我可以通过REPL访问它们.其他命名约定,比如使用"helper"后缀似乎很麻烦.

任何想法将不胜感激!

scala

10
推荐指数
2
解决办法
3270
查看次数

Scala禁止特定类型的参数化

有没有办法禁止参数化类型被特定类型参数化?

例如假设我想创建自己的专用List [T]类型,我不希望List [Nothing]合法,即导致编译错误.

我正在寻找一种方法来使以下错误更容易被捕获(是的,我知道这不是非常实用或伟大的Scala):

val x = ListBuffer()
x += 2
Run Code Online (Sandbox Code Playgroud)

x的类型为ListBuffer [Nothing].

scala

9
推荐指数
1
解决办法
181
查看次数

Scala编译时间检查构造函数调用的位置

我有一些代码具有不变量,即必须在最终使用的函数中构造对象(由于与全局状态相关的各种原因,这些原因并不理想但是是假设的一部分).

例如,假设下面的函数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

8
推荐指数
1
解决办法
204
查看次数

将Scala AST转换为源代码

给定一个Scala AST,有没有办法生成Scala源代码?

我正在研究通过解析/分析其他Scala源来自动生成Scala源的方法.任何提示将不胜感激!

scala abstract-syntax-tree

6
推荐指数
1
解决办法
1384
查看次数

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的辅助类.

scala

6
推荐指数
1
解决办法
3066
查看次数

带参数化类型的Scala反射

我编写了以下函数来检查给定的单例类是否实现了特征.

/** 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)

有任何想法吗?

scala

5
推荐指数
1
解决办法
312
查看次数