标签: scala-java-interop

scala中有没有办法从任何Map转换为java.util.Map?

我使用了很多scala贴图,偶尔我想将它们作为映射传递给想要java.util.Map的遗留java api(我不在乎它是否抛弃任何更改).

scala scala-java-interop

7
推荐指数
1
解决办法
2303
查看次数

在Android中使用Scala中的Java常量

我在Android上使用Scala进行开发时遇到了一个奇怪的问题.我正在使用sbt android插件,现在我正在努力让内容提供商工作,但......

我需要获得一系列列,我在这里完全像在教程中那样:http://developer.android.com/guide/topics/providers/content-providers.html

刚用Scala替换了Java的数组代码.它看起来像这样:

val projection = Array(
  People.NAME,
  People.NUMBER
)
Run Code Online (Sandbox Code Playgroud)

但是,scala编译器会返回错误

[error] /home/exine/proj/hello-world/src/main/scala/Activity.scala:12: value NAME is not a member of object android.provider.Contacts.People
[error]     People.NAME,
[error]            ^
[error] one error found
Run Code Online (Sandbox Code Playgroud)

实际上它这个对象的成员,它在接口android.provider.Contacts.PeopleColumns(由People实现)中定义.我也试过直接从PeopleColumns获取它而没有任何成功(同样的错误).在Scala中从Java中获取常量有些不同,或者我只是在某个地方犯了一个愚蠢的错误?

更新:

下一个问题.使用ContactsContract.Contacts错误时保持不变,并且在尝试其他方法时,我无法直接访问ContactsContract.ContactsColumns,因为它是受保护的接口.

[error] /home/exine/proj/hello-world/src/main/scala/Activity.scala:13: object ContactsColumns cannot be accessed in object android.provider.ContactsContract
[error]     ContactsColumns.LOOKUP_KEY,
[error]     ^
[error] one error found
Run Code Online (Sandbox Code Playgroud)

android scala scala-java-interop

7
推荐指数
1
解决办法
532
查看次数

从java.util.Vector转换为scala Seq

我可以看到有一些方法可以从java列表转换为scala seq,例如(使用asScala方法),但我找不到java.util.Vector的任何转换器.这种转换也有类似的方式吗?

scala scala-java-interop

7
推荐指数
1
解决办法
3773
查看次数

Scala,不喜欢java collections API吗?

我正在使用asynchttpclient.构建参数时,将java.util.Map传递给setParameters方法.

(Java)签名如下所示:

setParameters(Map<String,Collection<String>);
Run Code Online (Sandbox Code Playgroud)

真实的一天1.但哇,我正试图从Scala中调用它,我不能为我的生活创建一个与该签名相匹配的集合.

这是我到目前为止创造的混乱.

var m:java.util.Map[java.lang.String,java.util.Collection[java.lang.String]] = new java.util.HashMap[java.lang.String,java.util.HashSet[java.lang.String]]()
val req = new RequestBuilder().setUrl("http://localhost:1234/").setParameters(m).build
Run Code Online (Sandbox Code Playgroud)

这是错误信息,

Multiple markers at this line
- type mismatch; found : java.util.HashMap[java.lang.String,java.util.HashSet[java.lang.String]] required: 
 java.util.Map[java.lang.String,java.util.Collection[java.lang.String]] Note: java.util.HashSet[java.lang.String] <: java.util.Collection[java.lang.String], but Java-defined 
 **trait Map is invariant in type V. You may wish to investigate a wildcard type such as `_ <: java.util.Collection[java.lang.String]`. (SLS 3.2.10)**
- type mismatch; found : 
Run Code Online (Sandbox Code Playgroud)

很公平,我不会想到我做了一些特别复杂的事情,但是让我们试试编译器的建议......

所以我将其更改为以下内容

 var m:java.util.Map[java.lang.String,_ <: java.util.Collection[java.lang.String]] = new java.util.HashMap[java.lang.String,java.util.HashSet[java.lang.String]]()
 val req = new RequestBuilder().setUrl("http://localhost:1234/").setParameters(m).build
Run Code Online (Sandbox Code Playgroud)

并收到以下可爱的错误消息作为回应.

Multiple markers at …
Run Code Online (Sandbox Code Playgroud)

java scala covariance scala-java-interop

7
推荐指数
1
解决办法
828
查看次数

如何在Scala的foreach中使用Java List?

我试图使用asInstanceOf将java列表转换为Scala列表但没有成功,因为我从android调用返回的列表是一个java列表.

val apList = (wfm.getScanResults:java.util.List[ScanResult])
Run Code Online (Sandbox Code Playgroud)

希望这样做,以便我可以使用(新的Scala)列表进行理解,因为它似乎不喜欢在这个构造中使用java列表给我一个错误.

value foreach is not a member of java.util.List[android.net.wifi.ScanResult]
    for (ap<-apList) { .... }
         ^
Run Code Online (Sandbox Code Playgroud)

他们是一种在for/foreach中使用Java列表而不强制它的方法吗?如果我必须胁迫,怎么样?as asInstanceOf以这种方式使用时调用ar/t错误.

java scala scala-java-interop

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

Scala @throws多个例外

我需要从java调用scala代码,所以我需要告诉编译器某个方法抛出某些异常.对于一个例外,这很容易做到,但我很难声明一个方法抛出多个异常.

这不起作用:

@throws( classOf[ ExceptionA ], classOf[ExceptionB] )
Run Code Online (Sandbox Code Playgroud)

而且,显然,这也不是:

@throws( classOf[ ExceptionA , ExceptionB] )
Run Code Online (Sandbox Code Playgroud)

scala exception scala-2.8 scala-java-interop

7
推荐指数
1
解决办法
2484
查看次数

这真的是从Java传递void函数到Scala方法的方法吗?

我最近一直在玩Scala/Java互操作,特别是从Java(7)调用Scala(2.10.4)代码.它比我想象的更令人愉快,但有些事情让我困惑.

例如,scala.runtime我有一个很好的AbstractFunction抽象类集合.但我没有看到任何没有返回值的方法.例如,假设我有以下Scala代码:

class MyClass(name: String) {
  def SayWhat(say_fn: String => Unit) = say_fn(name)
}
Run Code Online (Sandbox Code Playgroud)

我的理解是Java void或多或少是Scala的Unit,所以我可以通过以下Java匿名类来模糊地传递类似lambda的东西:

import scala.Function1;
import scala.runtime.AbstractFunction1;
import scala.runtime.BoxedUnit;

public class MyProgram {
  public static void main(String[] args) {
    MyClass mc = new MyClass("Dan");

    Function1<String, BoxedUnit> f = new AbstractFunction1<String, BoxedUnit>() {
      public BoxedUnit apply(String s) {
        System.out.println("Why, hello there " + s);
          return null;
      }
    };

    mc.SayWhat(f);
  }
}
Run Code Online (Sandbox Code Playgroud)

这显然不是最漂亮的事情,但我AbstractFunction真的很欣赏这些东西,相比之下我不得不做的事情!但是真的没有AbstractProcedure什么东西吗?另外,为什么我的"lambda"必须返回BoxedUnit …

java lambda scala scala-java-interop

7
推荐指数
1
解决办法
2051
查看次数

如何在Java中将java.util.Map转换为scala.collection.immutable.Map?

我发现有很多人试图这样做,并询问这个问题,但问题总是以scala代码的形式回答.我需要调用一个期望scala.collection.immutable.Map的API,但我有一个java.util.Map,如何在我的java代码中从后者干净地转换为前者?编译器不同意这种情绪,即它是一种隐式转换,因为当我尝试它时就会对它进行barfs!

谢谢!

java scala scala-java-interop scala-collections

7
推荐指数
1
解决办法
4941
查看次数

从 Scala 调用 Java 通用类型化方法会出现类型不匹配错误:Scala

这是我在这里的第一个问题,所以我会尽量说清楚。error: type mismatch;此处的其他问题与此错误无关。

我在 scala/java 互操作性方面遇到了这个奇怪的问题:

假设我们有一个 Java 类

public class JavaClass{
  public static <T> T[] toArray(Class<T> t, Collection<T> coll) {
    return null; // return null to make it simple
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我有另一个 Scala 类,我只想将此方法包装在:

object ScalaClass{
  def toArray[T](t: java.lang.Class[T], coll: java.util.Collection[T]): Array[T] = {
    JavaClass.toArray[T](t, coll);
  }
}
Run Code Online (Sandbox Code Playgroud)

编译 Scala 类给了我一个非常奇怪的错误:

error: type mismatch;
Run Code Online (Sandbox Code Playgroud)

任何想法表示赞赏。

编辑 1:完整的错误消息是

[ERROR] ScalaScala.scala:4002: error: type mismatch;
[INFO]  found   : Array[T]
[INFO]  required: Class[T]
[INFO]  JavaClass.toArray[T](t, coll);
[INFO]                      ^
Run Code Online (Sandbox Code Playgroud)

java generics scala scala-java-interop

7
推荐指数
1
解决办法
224
查看次数

无法在scala中设置一个名为type的java注释成员?

我试图将一些Java代码移植到scala.代码使用带有成员调用的注释,type但这是scala中的关键字.有没有办法在scala中解决这个有效的java成员?

这是Java代码

@Component(
        name = "RestProcessorImpl",
        type = mediation // Compile error
        )
public class RestProcessorImpl {
 // impl
}
Run Code Online (Sandbox Code Playgroud)

这部分代码在scala中是相同的,除了它type是一个关键字,因此它不能编译.有没有办法逃避type关键字?

这也是带有type成员的java类的问题

HasType.java

package spike1;

public class HasType {
    public String type() { 
        return "the type";
    }
}
Run Code Online (Sandbox Code Playgroud)

UseType.scala

class UseType {
    def hasType = new HasType
    hasType.type() // Compile error
}
Run Code Online (Sandbox Code Playgroud)

java scala scala-java-interop

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