我这里有一个带有一些Java类的库.一个类有一些protected static方法,我意识到这是一个OOP禁止 - 但我不能改变它的代码.假设我有一个Scala类,它是上述Java类的子类,我该如何调用其受保护的静态成员?
我相信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)
有人可以给我一些暗示吗?
非常感谢
我正在尝试使用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号机票...)
在我的scala代码中,我使用的是一个java库,它定义了一个名为"val"的公共属性的对象:
public class XYZ {
public int val=...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在scala中获取此属性?
我创建了一个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) 我有以下等级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)
当我尝试按如下方式实施Adapter时scala
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类:
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常量.
我有一个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.
我正在尝试翻译以下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中构建比较器,但我很想知道为什么会失败.)
我想在我的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)类型不匹配; ...”