本人在尝试写cep的时候,发现了java导scala包的一个特性。
我在写其他工具类的时候,使用的是scala编写,但是在学习cep的时候,因为cep对scala支持不行,使用了java编写。当时候认为scala和java应该是互通的,并且我写了一个测试类也证明了可以正常互相调用。虽然不推荐使用,但是代码应该能跑通。结果报了很奇怪的错误:
明明已经正常导包,但是却找不到这个类。
最终研究发现,是因为我在编写的时候使用了嵌套类:
object Timer {
object WatermarkFactory {....}
object TimeWindowFactory {....}
}
在java环境下,是无法识别这种嵌套类的。
最后我又写了一个小测试来证明这个特性:
先用scala写一个类
object test02 {
object test03{
def out:Int = {
111
}
}
}
然后在java写一个类调用
public class test {
public static void main(String[] args) {
System.out.println(test02.test03.out());
}
}
结果果然是报错的
如果scala类这样写
object test02 {
def out:Int = {
111
}
}
并且java直接调用
public class test {
public static void main(String[] args) {
System.out.println(test02.out());
}
}
可以正常得到结果
这事告诉我们,java代码和scala代码还是最好不要混写,大佬们不推荐是有不推荐的理由的,混写总能遇见奇奇怪怪的问题。