标签: scala-java-interop

从Scala调用受保护的静态Java方法

我这里有一个带有一些Java类的库.一个类有一些protected static方法,我意识到这是一个OOP禁止 - 但我不能改变它的代码.假设我有一个Scala类,它是上述Java类的子类,我该如何调用其受保护的静态成员?

scala scala-java-interop

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

不能在Java中使用Scala类

我相信Scala和Java可以使用彼此的类.

但是,我发现自己的情况是我的Java类不能在同一个包中使用Scala类.

scala类定义为:

class CustomerService extends AbstractCustomerService {
Run Code Online (Sandbox Code Playgroud)

试图使用这段代码的代码是:

public Deployer() {
        singletons.add(new CustomerService());
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3:compile (default-compile) on project orderservice: Compilation failure
[ERROR] \devel\raven\services\orderservice\service\src\main\scala\com\mxyy\orderservice\customer\Deployer.java:[12,31] cannot find symbol
[ERROR] symbol  : class CustomerService
[ERROR] location: class com.mxyy.orderservice.customer.Deployer
Run Code Online (Sandbox Code Playgroud)

有人可以给我一些暗示吗?

非常感谢

java scala maven scala-java-interop

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

从Scala实现具有Raw类型的Java接口

我正在尝试使用Scala为Sonar构建扩展.我需要扩展以下Java接口:

public interface Decorator extends BatchExtension, CheckProject {
    void decorate(Resource resource, DecoratorContext context);
}
Run Code Online (Sandbox Code Playgroud)

资源类型实际上定义如下:

public abstract class Resource<PARENT extends Resource>
Run Code Online (Sandbox Code Playgroud)

我知道我可以解决创建Java原始超类的问题.我想坚持只使用Scala,也知道是否有一个我缺少的解决方案,以及是否有一个改进我可以建议SonarSource人员在他们身边(使用原始类型).

我已经阅读过这方面存在的问题,以及某些情况下的一些解决方法,但似乎没有适用于此处(一种解决方法,一张明显固定的机票,还有2091号机票...)

java generics scala scala-java-interop sonarqube

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

Scala:"val"作为标识符可能吗?链接到java库需要它

在我的scala代码中,我使用的是一个java库,它定义了一个名为"val"的公共属性的对象:

public class XYZ {
    public int val=...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在scala中获取此属性?

java scala scala-java-interop

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

无法从scala访问java静态方法

我创建了一个java和scala混合的程序,但是我在尝试从scala调用java静态方法时遇到错误.这是代码:

object GestionBasesScala {

  def sors_tout_de_suite() {

    application.launcher.append("SCALA : exit")
  }
}
Run Code Online (Sandbox Code Playgroud)

启动器类的append方法是这样的(在java中):

public static void append(String text) {

    if (name_of_file != null && name_of_file != "") {
        BufferedWriter bufWriter = null;
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter(name_of_file, true);
            bufWriter = new BufferedWriter(fileWriter);
            // Ins�rer un saut de ligne
            bufWriter.newLine();
            bufWriter.write(text);
            bufWriter.close();
        } catch (IOException ex) {
              //     Logger.getLogger(TextFileWriter.class.getName()).log(Level.SEVERE,
            // null, ex);
        } finally {
            try {
                bufWriter.close();
                fileWriter.close();
            } catch (IOException ex) {
                // Logger.getLogger(TextFileWriter.class.getName()).log(Level.SEVERE, …
Run Code Online (Sandbox Code Playgroud)

mixed static scala scala-java-interop

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

在Scala中实现多级Java接口

我有以下等级java为我的interface

public interface Identifiable<T extends Comparable<T>> extends Serializable {
    public T getId();
}
public interface Function extends Identifiable {
    public String getId();
}
public abstract class Adapter implements Function {
    public abstract String getId();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试按如下方式实施Adapterscala

class MultiGetFunction extends Adapter {
  def getId() : String = this.getClass.getName
}
Run Code Online (Sandbox Code Playgroud)

我收到了以下错误

Multiple markers at this line
    - overriding method getId in trait Identifiable of type ()T; method getId has incompatible 
     type
    - overrides Adapter.getId
    - implements …
Run Code Online (Sandbox Code Playgroud)

java generics scala scala-java-interop

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

scala注释中的static final

我有一个常量的java类:

public abstract class TestGroup {
    public static final String UNIT = "unit";
    ...
}
Run Code Online (Sandbox Code Playgroud)

在java中我可以在注释中使用它:

@Test(groups=TestGroup.UNIT)
public class Unit1Test {...}
Run Code Online (Sandbox Code Playgroud)

但是当我在Scala(2.10.4)中这样做时:

@Test(groups=Array(TestGroup.UNIT))
class Unit2Test{...}
Run Code Online (Sandbox Code Playgroud)

我得到这个编译错误:

 error: annotation argument needs to be a constant; found: TestGroup.UNIT
 [ERROR] @Test(groups=Array(TestGroup.UNIT))
 [ERROR]                              ^
Run Code Online (Sandbox Code Playgroud)

如何在Scala中使用带有常量的注释和交叉编译?

注意:上一个问题如何在注释中添加常量和文字?没有帮助,因为它在Scala代码中显示了Scala常量.我想使用Scala代码中的Java常量.

java annotations scala scala-java-interop

6
推荐指数
0
解决办法
649
查看次数

如何使用多个可变参数方法(类型橡皮擦问题)在Scala中实现Java接口?

我有一个Scala类正在尝试实现一个Java接口(JavaEE 7中的EntityManager用于特定的单元测试).界面有这两种方法(其中包括):

public StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class... resultClasses);
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String... resultSetMappings);
Run Code Online (Sandbox Code Playgroud)

在Scala实现中,我有:

override def createStoredProcedureQuery(procedureName: String, resultClasses: Class[_]*): StoredProcedureQuery = ???
override def createStoredProcedureQuery(procedureName: String, resultSetMappings: String*): StoredProcedureQuery = ???
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

MyTest.scala:134: error: double definition:
method createStoredProcedureQuery:(procedureName: String, resultSetMappings: String*)javax.persistence.StoredProcedureQuery and
method createStoredProcedureQuery:(procedureName: String, resultClasses: Class[_]*)javax.persistence.StoredProcedureQuery at line 133
have same type after erasure: (procedureName: String, resultSetMappings: Seq)javax.persistence.StoredProcedureQuery
override def createStoredProcedureQuery(procedureName: String, resultSetMappings: String*): StoredProcedureQuery = ???
Run Code Online (Sandbox Code Playgroud)

我无法想出一个解决方案.我的Google搜索也未能找到并回答.我正在使用Scala 2.10.4.

scala scala-java-interop

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

Scala在Comparator.thenComparing中解析为错误覆盖

我正在尝试翻译以下Java代码:

import java.util.Comparator;

public class ComparatorTestJava {
    public static void test() {
        Comparator<String> cmp = (s1, s2) -> 0;
        cmp = cmp.thenComparing(s -> s);
    }
}
Run Code Online (Sandbox Code Playgroud)

进入斯卡拉.我认为这应该有效:

import java.util.{Comparator, function}

object ComparatorTest {
  var comparator: Comparator[String] = (t1, t2) ? 0
  comparator = comparator.thenComparing(new function.Function[String, String] {
    override def apply(t: String): String = t
  })
}
Run Code Online (Sandbox Code Playgroud)

但它失败并出现以下错误:

Error:(7, 41) type mismatch;
 found   : java.util.function.Function[String,String]
 required: java.util.Comparator[? >: String]
  comparator = comparator.thenComparing(new function.Function[String, String] {
Run Code Online (Sandbox Code Playgroud)

看起来Scala编译器确信我正在尝试使用thenComparing(Comparator)而不是thenComparing(Function).有什么方法可以告诉它它是什么?或者这实际上不是问题?

(我意识到还有其他的,也许更惯用的方法在Scala中构建比较器,但我很想知道为什么会失败.)

generics scala scala-java-interop

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

如何将Java双冒号运算符(::)转换为Scala?

我想在我的ScalaTests中使用camunda-bpm-assert-scenario

我在这里有以下代码receiveTask::receive

when(documentRequest.waitsAtReceiveTask("ReceiveTaskWaitForDocuments")).thenReturn((receiveTask) -> {
  receiveTask.defer("P1DT1M", receiveTask::receive);
});
Run Code Online (Sandbox Code Playgroud)

根据中的答案,是否可以在Scala中使用Java 8样式方法引用?我可以很容易地将其翻译为:

receiveTask.defer("P1D", receiveTask.receive _)
Run Code Online (Sandbox Code Playgroud)

但这给了我:

Error:(84, 45) type mismatch;
 found   : Unit
 required: org.camunda.bpm.scenario.defer.Deferred
       receiveTask.defer("P1D", receiveTask.receive _)
Run Code Online (Sandbox Code Playgroud)

这是receive功能:

void receive();
Run Code Online (Sandbox Code Playgroud)

这是预期的接口:

public interface Deferred {
  void execute() throws Exception;
}
Run Code Online (Sandbox Code Playgroud)

如何在Scala中实现这一目标?这不是Scala中可以使用Java 8样式方法引用的副本吗?,则无法解决“错误:(84,45)类型不匹配; ...”

java lambda scala scala-java-interop camunda

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