【问题标题】:scala operators as methods in javascala运算符作为java中的方法
【发布时间】:2014-09-23 05:22:38
【问题描述】:

在操作 scala 对象(主要来自 scala.collection 包)时,运算符重载函数似乎可以在 Java 中使用。

即在斯卡拉中

var s = Set(1, 2, 3)
var t = s + 4
var x = s | t

所以在Java中,在eclipse自动完成中查看scala.collection.Set,我可以看到原型

但我无法正确使用它们

import scala.collection.Set;

Set<Integer> s = new Set<Integer>();
Set<Integer> t = s.$plus(4); /* compile error with javac, or runtime error with eclipse/*

这些 scala 方法是如何在 Java 中使用的?

【问题讨论】:

  • 我想这不是方法名称本身的问题:原因可能是 scala 集合层次结构和逆变:javac 无法将 scala.collection.Set&lt;String&gt; 视为 scala.collection.immutable.Set&lt;String&gt;

标签: java eclipse scala scala-collections scala-java-interop


【解决方案1】:

您似乎无法在 Java 中对某些 scala 接口进行编码!
此代码在 Sun 和 Eclipse 中正确编译和执行。

注意在作业左侧使用HashSet

import scala.collection.HashSet;

public class TestCase1 {

    public static void main(String[] args) {
        HashSet<String> set2 = new HashSet<String>();

        HashSet<String> set4 = set2.$plus("test");

        System.out.println(set2.size());
        System.out.println(set4.size());


    }
}

为什么会这样?

我认为这与 Scalas 继承多个特征的能力有关,这是 java eclipse 无法理解的。

例如,HashSet 扩展了AbstractSet, Set, GenericSetTemplate,SetLike, FlatHashTable, CustomParallelizable, Serializable,其中一些是接口,其中一些是抽象类。

.$plus() 方法似乎来自SetLike,而不是Set,这可以解释为什么在Set 超类型上调用该方法会导致此错误。

也就是说,我仍然无法使用超类型 SetLike 引用 HashSet,因为它仍然失败,我只能做到这一点。

我认为这里的主要问题是 Elipse 以某种方式将 Supertype 歪曲为具有这些方法,这是错误的。

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2018-03-26
    • 2020-10-01
    相关资源
    最近更新 更多