如何在Scala中使用Java自绑定类
假设我有一个自绑定java类:如何在Scala中使用Java自绑定类,java,scala,Java,Scala,假设我有一个自绑定java类: public class SelfBounded<SELF extends SelfBounded<SELF>> { public String testField = "TEST"; public SelfBounded() { } public SELF testMethod() { return (SELF) this; } } 这段代码给了我预期的2倍“测试” 但我正在
public class SelfBounded<SELF extends SelfBounded<SELF>> {
public String testField = "TEST";
public SelfBounded() {
}
public SELF testMethod() {
return (SELF) this;
}
}
这段代码给了我预期的2倍“测试”
但我正在努力用scala写同样的东西:
如果我不传递该类型,它将成为自绑定[无]。但是,如果尝试使用SelfBounded类型,例如:SelfBounded[SelfBounded]”,它会给我带来麻烦,因为它具有递归性质,编译器告诉我每个“SelfBounded”都需要一个类型参数
object SelfBoundedMainScala extends App {
// here the type of selfBounded1 is SelfBounded[Nothing]
val selfBounded1 = new SelfBounded()
println(selfBounded1.testField)
// does not work since testMethod() returns a Nothing
//println(selfBounded1.testMethod().testField)
// trying to set the type of the selfBounded variable gives me issues because of the recursive type
// does not compile 'class SelfBounded takes type parameters'
// val selfBounded2: SelfBounded[SelfBounded] = new SelfBounded()
// same issue
// val selfBounded3 = new SelfBounded[SelfBounded]()
}
有没有办法在Scala中完成Java主类,而不改变自绑定类定义
注意:这是在Scala中尝试使用testcontainers java时的一个简化示例。当您在java中编写
SelfBounded SelfBounded=new SelfBounded()
时,您正在使用它,它的存在只是为了与泛型之前的代码兼容。不要那样做。正确的方法是扩展自绑定的:
class SelfBounded1 extends SelfBounded<SelfBounded1> {}
public class SelfBoundedMainJava {
public static void main(String[] args) {
// or SelfBounded<?> selfBounded
SelfBounded1 selfBounded = new SelfBounded1();
System.out.println(selfBounded.testField);
System.out.println(selfBounded.testMethod().testField);
}
}
谢谢这是一个很好的解决方案。但我想知道为什么在testcontainers java示例中他们会这样使用它?selfbounded类是GenericContainer(),这实际上可能是对原始类型的合理使用(我首先看到)。在Scala中,您可以使用this.type
获得相同的结果,但Java没有等效的。
class SelfBounded1 extends SelfBounded<SelfBounded1> {}
public class SelfBoundedMainJava {
public static void main(String[] args) {
// or SelfBounded<?> selfBounded
SelfBounded1 selfBounded = new SelfBounded1();
System.out.println(selfBounded.testField);
System.out.println(selfBounded.testMethod().testField);
}
}
object SelfBoundedMainScala extends App {
class SelfBounded1 extends SelfBounded[SelfBounded1]
val selfBounded1 = new SelfBounded1()
println(selfBounded1.testField)
println(selfBounded1.testMethod().testField)
}