我使用了很多scala贴图,偶尔我想将它们作为映射传递给想要java.util.Map的遗留java api(我不在乎它是否抛弃任何更改).
我在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) 我可以看到有一些方法可以从java列表转换为scala seq,例如(使用asScala方法),但我找不到java.util.Vector的任何转换器.这种转换也有类似的方式吗?
我正在使用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)
这是错误信息,
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 :
很公平,我不会想到我做了一些特别复杂的事情,但是让我们试试编译器的建议......
所以我将其更改为以下内容
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)
并收到以下可爱的错误消息作为回应.
Run Code Online (Sandbox Code Playgroud)Multiple markers at …
我试图使用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代码,所以我需要告诉编译器某个方法抛出某些异常.对于一个例外,这很容易做到,但我很难声明一个方法抛出多个异常.
这不起作用:
@throws( classOf[ ExceptionA ], classOf[ExceptionB] )
Run Code Online (Sandbox Code Playgroud)
而且,显然,这也不是:
@throws( classOf[ ExceptionA , ExceptionB] )
Run Code Online (Sandbox Code Playgroud) 我最近一直在玩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 …
我发现有很多人试图这样做,并询问这个问题,但问题总是以scala代码的形式回答.我需要调用一个期望scala.collection.immutable.Map的API,但我有一个java.util.Map,如何在我的java代码中从后者干净地转换为前者?编译器不同意这种情绪,即它是一种隐式转换,因为当我尝试它时就会对它进行barfs!
谢谢!
这是我在这里的第一个问题,所以我会尽量说清楚。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代码移植到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)