Biorąc usługę w Scala:Interoperacyjność Scala/Java: jak radzić sobie z opcjami zawierającymi Int/Long (typy pierwotne)?
class ScalaService {
def process1(s: Option[String], i: Option[Int]) {
println("1: " + s + ", " + i)
}
}
który ma być używany z Java:
public class Java {
public static void main(String[] args) {
ScalaService service = new ScalaService();
// This works, but it's confusing
{
scala.Option<String> so = scala.Option.apply("Hello");
scala.Option<Object> io = scala.Option.apply((Object) 10);
service.process1(so, io);
}
// Would be OK, but not really nice
{
scala.Option<Object> so = scala.Option.apply((Object) "Hello");
scala.Option<Object> io = scala.Option.apply((Object) 10);
service.process1(so, io); // Does not compile
}
// The preferred way
{
scala.Option<String> so = scala.Option.apply("Hello");
scala.Option<Integer> io = scala.Option.apply(10);
service.process1(so, io); // Does not compile
}
}
}
chciałbym uniknąć w leczeniu pierwotnych i innych prymitywnych typów w inny sposób.
Więc starałem się obejść ten problem poprzez dodanie innej metody:
def process2(s: Option[String], i: Option[java.lang.Integer]) {
print("2: ")
process1(s, i.map(v => v.toInt))
}
ale to wymaga innej nazwy dla tej metody. Ponieważ może to być mylące z punktu widzenia dzwoniącego, czy są jakieś inne możliwości?
Używam Scala 2.10.1 i Java 1.6
Dzięki za sugestie. Chciałbym udostępnić obie metody (jedną dla Scala, jedną dla Javy), obie z Int/Integer. Ponieważ istnieje wiele funkcji usługowych, powinna być krótka. Jeśli chodzi o parametry "implicit", AFAIK, muszą one być jawnie dodane w Javie. To chyba po prostu zbyt wiele wymagań :-) – Beryllium