如何在Scala中使用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倍“测试” 但我正在

假设我有一个自绑定java类:

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)
}