可能重复:
从Java访问scala.None
在Java中,您可以创建Some使用构造函数的实例,即new Some(value),但None没有合作伙伴类.你如何None从Java 传递给Scala函数?
我正在使用用Java编写的外部库(Selenium).其中一个函数调用具有签名type(String, String),当我尝试从Scala调用它时,我一直遇到编译器错误,即:
selenium.type("ab","abc")
Run Code Online (Sandbox Code Playgroud)
这个问题有解决方法吗?
我希望能够执行以下操作,但是在调用useMap时失败了.我该如何进行此转换?
scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._
scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._
scala> def useMap(m: java.util.Map[java.lang.Integer, java.lang.Float]) = m
useMap: (m: java.util.Map[Integer,Float])java.util.Map[Integer,Float]
scala> val v: Map[Int, Float] = Map()
v: Map[Int,Float] = Map()
scala> useMap(v)
<console>:10: error: type mismatch;
found : scala.collection.immutable.Map[Int,scala.Float]
required: java.util.Map[Integer,java.lang.Float]
useMap(v)
^
Run Code Online (Sandbox Code Playgroud)
它似乎适用于Map [String,String],但不适用于Map [Int,Float].
collections scala type-conversion implicit-conversion scala-java-interop
在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对象,我需要在Java类中使用.
这是Scala对象
object Person {
val MALE = "m"
val FEMALE = "f"
}
Run Code Online (Sandbox Code Playgroud)
如何在Java中使用此Scala对象?
到目前为止我没有成功尝试过以下内容(编译错误):
Person.MALE() //返回一个无用的String,因为我想要实际的Person对象我正在学习Scala,我有一个Java项目要迁移到Scala.我想通过逐个重写类并检查新类没有破坏项目来迁移它.
这个Java项目使用了很多java.util.List和java.util.Map.在新的Scala类中,我想使用Scala List并Map拥有漂亮的Scala代码.
问题是新的类(那些在Scala中是wtitten)没有与现有的Java代码无缝集成:Java需要java.util.List,Scala需要它自己的代码scala.List.
以下是该问题的简化示例.有Main,Logic,Dao类.他们互相称呼:Main - > Logic - > Dao.
public class Main {
public void a() {
List<Integer> res = new Logic().calculate(Arrays.asList(1, 2, 3, 4, 5));
}
}
public class Logic {
public List<Integer> calculate(List<Integer> ints) {
List<Integer> together = new Dao().getSomeInts();
together.addAll(ints);
return together;
}
}
public class Dao {
public List<Integer> getSomeInts() {
return Arrays.asList(1, 2, 3); …Run Code Online (Sandbox Code Playgroud) 在上一个问题中,从Java访问scala.None,似乎人们已经习惯javap了解如何scala.None从Java 访问.我想知道他们是怎么做到的.仅供参考,答案是:
scala.Option$.MODULE$.apply(null);
Run Code Online (Sandbox Code Playgroud)
可以缩短为:
scala.Option.apply(null);
Run Code Online (Sandbox Code Playgroud)
鉴于此计划(OptionTest.scala):
object OptionTest extends App {
val x = scala.None
val y = scala.Some("asdf")
}
Run Code Online (Sandbox Code Playgroud)
我这样跑javap了:
javap -s -c -l -private OptionTest
Run Code Online (Sandbox Code Playgroud)
这是javap输出的一部分:
public static final scala.None$ x();
Signature: ()Lscala/None$;
Code:
0: getstatic #11; //Field OptionTest$.MODULE$:LOptionTest$;
3: invokevirtual #55; //Method OptionTest$.x:()Lscala/None$;
6: areturn
Run Code Online (Sandbox Code Playgroud)
我也javap的上运行scala.None和scala.Option.如何从javap输出中找出:
None是唯一None.type延伸的类型的对象Optionapply()伴侣对象的方法是必需的?
我从Java调用Scala方法.我需要进行从Seq到List的转换.
我无法修改Scala方法的签名,所以我无法使用该asJavaCollection方法scala.collection.JavaConversions._
有关如何实现这一目标的任何想法?
使用Scala 2.9.3
在将现有Java代码库逐步迁移到Scala时,需要注意哪些最重要的要点和解决方法?具有(可能非常长)的中间阶段,其中两种语言都在使用中.
我正在考虑的事情是:
我在Scala中有一个Set(我可以选择任何实现,因为我正在创建Set.我正在使用的Java库需要一个java.util.Set [String].
以下是在Scala中执行此操作的正确方法(使用scala.collection.jcl.HashSet#underlyinges):
import com.javalibrary.Animals
var classes = new scala.collection.jcl.HashSet[String]
classes += "Amphibian"
classes += "Reptile"
Animals.find(classes.underlying)
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,但由于我是Scala的新手,我想知道这是否是首选方式(我尝试的任何其他方式都会出现类型不匹配错误):
error: type mismatch;
found : scala.collection.jcl.HashSet[String]
required: java.util.Set[_]
Run Code Online (Sandbox Code Playgroud) scala type-conversion scala-2.8 scala-java-interop scala-collections