【问题标题】:What is the Java-compatibile equivalent in Scala for <? extends Foo>Scala 中与 Java 兼容的等价物是什么?扩展 Foo>
【发布时间】:2014-02-15 23:05:55
【问题描述】:

我有一个带有方法的 java 类“JavaClass”:

boolean addAll(java.util.Collection<? extends java.lang.Integer> collection) { ... }

我需要创建一个 Scala trait MyTrait 包含此方法而无需实现,例如

def addAll[A<:java.lang.Integer](coll: java.util.Collection[A]) : Boolean

这样一个实现

class MyClass extends JavaClass with MyTrait

不会是抽象的。但是我想不出任何方法来匹配 Trait 中的 Java 签名。

FWIW... 我正在尝试为Trove 编写一些与 Scala 集合兼容的高性能包装器,它避免使用泛型来为基元提供高性能,但对每种基元类型都使用高度一致的接口。我发现一般来说,特征可以很好地建模与类型无关的半接口,但我无法弄清楚如何表达这个特定的签名——即使暂时忽略我正在使用的类型抽象的特征。

【问题讨论】:

  • 动机几乎总是值得一试!
  • @RandallSchulz 好的,你要求的 ;-) - 查看更新后的帖子。
  • 我用过 Trove。 Scala 对此的回答称为specialization,其中@specialized 注释用于告诉编译器为每个指定的原始类型创建目标实体的单独重载。
  • @RandallSchulz 我在几个地方读到过,要有意义地@@specialize Scala 集合实现是不可能的,或者几乎是不可能的——无论如何,一个总是以拳击结束。所以我从一个不同的地方开始,看看我是否能到达任何地方。如果不出意外,我会在此过程中学到很多东西。

标签: scala generics traits


【解决方案1】:

Collection&lt;? extends java.lang.Integer&gt;在java中相当于

Collection[T] forSome {type T <: java.lang.Integer}

或使用占位符语法Collection[_ &lt;: java.lang.Integer] 在斯卡拉中

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 2019-07-17
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多