标签: scala-java-interop

Scala搜索一个模糊的Main类

我应该是一个简单的scala脚本,如下所示:

object SaveTaggedSenseTask {                                                    
  def main(args:  Array[String]) {
    val reader:SenseEvalAllWordsDocumentReader = new SenseEvalAllWordsDocumentReader()
    reader.parse(args(0))                                                   
    println(reader.sentences)                                               
    reader.sentences()
  }
}
Run Code Online (Sandbox Code Playgroud)

SenseEvalAllWordsDocumentReader是一个java定义的类,它只是SAX解析器的包装器.调用句子应该只返回另一个名为Sentence的java定义类的java List.如果我使用运行此代码

scala -cp jar-with-everything.jar SaveTaggedSenseTask.scala path/to/file.xml
Run Code Online (Sandbox Code Playgroud)

我得到以下可怕的输出混乱:

java.lang.ClassNotFoundException: Main (args = /home/stevens35/senseEval/senseEval3-allwords/english-all-words.xml, classpath = /tmp/scalascript7300484879512233483.tmp:/usr/java/jdk1.6.0_26/jre/lib/resources.jar:/usr/java/jdk1.6.0_26/jre/lib/rt.jar:/usr/java/jdk1.6.0_26/jre/lib/jsse.jar:/usr/java/jdk1.6.0_26/jre/lib/jce.jar:/usr/java/jdk1.6.0_26/jre/lib/charsets.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/jline.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scala-compiler.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scala-dbc.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scala-library.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scalap.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scala-swing.jar:/usr/java/jdk1.6.0_26/jre/lib/ext/sunjce_provider.jar:/usr/java/jdk1.6.0_26/jre/lib/ext/sunpkcs11.jar:/usr/java/jdk1.6.0_26/jre/lib/ext/localedata.jar:/usr/java/jdk1.6.0_26/jre/lib/ext/dnsns.jar:/home/stevens35/devel/C-Cat/wordnet/.:/home/stevens35/devel/C-Cat/wordnet/target/extendOntology-wordnet-1.0-jar-with-dependencies.jar:/home/stevens35/devel/C-Cat/wordnet/../data/target/extendOntology-data-1.0.jar)                                               
        at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:103)                                                                 
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33)
        at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40)
        at scala.tools.nsc.ScriptRunner.scala$tools$nsc$ScriptRunner$$runCompiled(ScriptRunner.scala:171)                                                       
        at scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:188)                                                                      
        at scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:188)                                                                      
        at scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply$mcZ$sp(ScriptRunner.scala:157)                                                      
        at scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply(ScriptRunner.scala:131)                                                             
        at scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply(ScriptRunner.scala:131)                                                             
        at scala.tools.nsc.util.package$.waitingForThreads(package.scala:26)
        at scala.tools.nsc.ScriptRunner.withCompiledScript(ScriptRunner.scala:130)                                                                              
        at scala.tools.nsc.ScriptRunner.runScript(ScriptRunner.scala:188)
        at scala.tools.nsc.ScriptRunner.runScriptAndCatch(ScriptRunner.scala:201)                                                                               
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:58)                                                                            
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Run Code Online (Sandbox Code Playgroud)

我假设这意味着scala正在寻找一个名为Main的类而无法找到它,但我无法弄清楚为什么它甚至会想到这个.此外,如果我删除该reader.sentences()行,或执行类似调用的size()操作,问题就会消失.我只能猜测scala以某种方式推断出由于这个调用而存在一个名为Main的类,但我没有看到任何明显的解决方法.

思考?任何帮助是极大的赞赏.

scala scala-java-interop

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

如何在Scala等效中转换Java foreach循环?

我正在尝试将以下Java代码转换为Scala:

Map<String, List<String>> allEntriesMap = getEntries();
for (Map.Entry<String, List<String>> allEntriesMapEntry : allEntriesMap
        .entrySet()) {
}
Run Code Online (Sandbox Code Playgroud)

以下是上述Java代码的当前Scala版本:

var allEntriesMap : Map[String, List[String]] = getEntries();
for (allEntriesMap.entrySet[String, List[String]] allEntriesMapEntry :
        allEntriesMap.entrySet()) {
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误的行

for (allEntriesMap.entrySet[String, List[String]] allEntriesMapEntry : 
Run Code Online (Sandbox Code Playgroud)

非法启动简单模式

如何完成上面的代码,以便它执行相同的Java功能,但用Scala编写?

java scala scala-java-interop

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

Java-如何将Scala Stream转换为Java Stream?

我有一个接收到的Java应用程序Scala Stream

我需要将其转换为Java Stream

如何在Java中做到这一点?

java scala scala-java-interop

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

如何将scala.collection.immutable.List [scala.collection.mutable.MutableList [String]]转换为java.util.List [java.util.List [String]]

我有一个Scala方法在java类中使用抛出下面的错误.由于某种原因,隐式转换不起作用List,Lists但它确实适用于List.(为前:mutable.MutableListutil.List)

Error:(124, 143) type mismatch;
    found: scala.collection.immutable.List[scala.collection.mutable.MutableList[String]]
     required: java.util.List[java.util.List[String]]
Run Code Online (Sandbox Code Playgroud)

要么

Error:(124, 143) type mismatch;
    found: scala.collection.immutable.List[scala.collection.mutable.MutableList[String]]
     required: scala.collection.immutable.List[java.util.List[String]]
Run Code Online (Sandbox Code Playgroud)

java scala list scala-java-interop

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

Call a Scala "val function" from Java gives error

I have a scala val function as follows :

  val getTimestampEpochMillis = (year:Int, month:Int, day:Int, hour:Int, quarterHour:Int, minute:Int, seconds:Int) => {
    var tMinutes = minute
    var tSeconds = seconds
    if(minute == 0){
      if(quarterHour == 1){
        tMinutes = 22
        tSeconds = 30
      }else if(quarterHour == 2){
        tMinutes = 37
        tSeconds = 30
      }else if(quarterHour == 3){
        tMinutes = 52
        tSeconds = 30
      }else if(quarterHour == 0){
        tMinutes = 7
        tSeconds = 30
      }
    }

    val localDateTime = LocalDateTime.of(year, month, day, hour, …
Run Code Online (Sandbox Code Playgroud)

java scala scala-java-interop

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

使用反射覆盖 2 + 2 = 5

容忍我,我明白这是一个奇怪的问题。

我刚刚偶然发现了 Java 的反射库,特别是 Lex Fridman 视频中的这段代码,它覆盖了2 + 2 = 5

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws Exception {
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field c = cache.getDeclaredField("cache");
        c.setAccessible(true);
        Integer[] array = (Integer[]) c.get(cache);
        array[132] = array[133];

        System.out.printf("%d",2 + 2);
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图通过将其转换为等效的 Scala 形式来了解它正在做什么,但它没有编译为Int.getClass.getDeclaredClasses返回一个空数组:

import java.lang.reflect.Field

val cache: Class[_] = Int.getClass.getDeclaredClasses.head
// above line throws java.util.NoSuchElementException: next on empty iterator

val c: Field = cache.getDeclaredField("cache")
c.setAccessible(true)
val array …
Run Code Online (Sandbox Code Playgroud)

java reflection scala scala-java-interop

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

使用Scala中的java.util.Map

我需要使用以下方法使用java-legacy代码:

public void doit(Map <String, Object> vals) {...}
Run Code Online (Sandbox Code Playgroud)

我的Scala代码:

var map = new java.util.HashMap[String, Any]
map += "testme" -> 'X'
doit(map)
Run Code Online (Sandbox Code Playgroud)

yield =>

类型不匹配; found:java.util.HashMap [String,Any] required:java.util.HashMap [java.lang.String,java.Object]

所以我把它改成:

var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> 'X'
doit(map)
Run Code Online (Sandbox Code Playgroud)

yield =>

类型不匹配; found:需要Char:java.lang.Object注意:原始类型不会隐式转换为AnyRef.你可以通过施放x.asInstanceOf [AnyRef]来安全地强制拳击.

最后我想出了以下内容:

var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> 'X'.asInstanceOf[AnyRef]
doit(map)
Run Code Online (Sandbox Code Playgroud)

是否有更简洁的方法来解决这个问题?

collections scala generic-collections scala-java-interop scala-collections

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

Scala:从java接口覆盖方法

我正在尝试在scala中实现通用java接口.我看过: 如何在Scala中扩展包含泛型方法的Java接口?Scala:重写通用Java方法II

但我还是找不到答案.这是Spring web的方法签名:

T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException;
Run Code Online (Sandbox Code Playgroud)

我在scala中尝试了以下内容:

 @throws(classOf[IOException])
  @throws(classOf[HttpMessageNotReadableException])
  override def read[T](clazz : Class[_ <: T], inputMessage : HttpInputMessage) : T ={
  } 
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误,说这种方法无法覆盖.如果我通过执行以下操作擦除类型:

override def read(clazz : Class[_], inputMessage : HttpInputMessage) : AnyRef ={
Run Code Online (Sandbox Code Playgroud)

它将该方法标记为被覆盖.我的问题是如何在这里保持类型安全并强制它覆盖接口方法?

问候

编辑

弹簧接口:

public interface HttpMessageConverter<T> {

T read(Class<? extends T> clazz,
       HttpInputMessage inputMessage)
       throws IOException,
              HttpMessageNotReadableException
}
Run Code Online (Sandbox Code Playgroud)

overriding scala scala-java-interop

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

如何使用JavaConversions将Map的Iterator从Java转换为Scala

我使用Scala 2.10.3.
result.iterator()回来了Iterator<java.util.Map<String, Object>>.(在Java中)

我想将它转换为Scala等价物.
import scala.collection.JavaConversions._用来试图做到这一点.

但是,它似乎无法考虑类型参数,在这种情况下,它可以转换java.util.Iterator为Scala等效项,但无法转换java.util.Map为Scala等效项.

实际上,此行发生编译器错误:

val results: Iterator[Map[String, AnyRef]] = result.iterator()

    type mismatch;
     found   : java.util.Iterator[java.util.Map[String,Object]]
     required: scala.collection.Iterator[scala.collection.immutable.Map[String,AnyRef]]
     val results: Iterator[Map[String, AnyRef]] = result.iterator()
                                                                ^
Run Code Online (Sandbox Code Playgroud)

有没有简短的方法来做这个伎俩?

scala scala-java-interop scala-collections

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

使用java中的scala宏

目前我正在编写一个scala宏库,我想也可以从java中使用它.

但我想不出一种方法来访问scala宏方法形式的java源代码.我们有什么方法可以使用java中的scala宏方法.

scala scala-java-interop scala-macros

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