【问题标题】:Invoke overridden method in scala trait extending java class A, implemented by java class B在扩展 java 类 A 的 scala trait 中调用被覆盖的方法,由 java 类 B 实现
【发布时间】:2023-04-09 11:02:01
【问题描述】:

是否可以通过另一个扩展类 A 的 B 类调用扩展类 A 的 Scala 类中的方法并实现特征?

public class A {
    public int foo(int someData) {
        return -1;
    }
}

如果我用 Scala 类扩展特征,则将调用特征中的方法。在java中它没有。

trait T extends A {
    override def foo(int: someData) = {
        if data < 10 {
            return data * 2
        } else {
            return 0
        }
    }
}

这是我调用 foo() 的类:

public class B extends A implements T {}

这应该打印 44 而不是 -1

public class Main {
    B b = new B();
    System.out.println(b.foo(22));
}

【问题讨论】:

    标签: java scala


    【解决方案1】:

    这行得通:

    scala> trait A {
         | def foo(someData:Int) = -1
         | }
    defined trait A
    
    scala> trait T extends A {
         | override def foo(someData:Int) = if (someData<10) someData*2 else 0
         | }
    defined trait T
    
    scala> class B extends T
    defined class B
    
    scala> val b = new B
    b: B = B@4e009c5e
    
    scala> b.foo(3)
    res4: Int = 6
    

    顺便说一下,根据你自己的定义,b.foo(22) 会打印 0,而不是 44。

    更新:刚刚意识到您的意思是 Java -> Scala -> Java 继承。我的回答仅与 Scala 有关。原则上这同样适用于Java(更多关于它的答案:Using Scala traits with implemented methods in Java 和这里:http://lampwww.epfl.ch/~michelou/scala/using-scala-from-java.html) - 具有方法实现的特征应该作为接口转换为Java,而具有方法实现的特征作为抽象类。

    您是否尝试在 java 中创建 B 类:

    public class B implements T {}
    

    ?

    【讨论】:

    • 问题是我不能更改 A 或 T,因为它在库中。
    最近更新 更多