【发布时间】:2011-07-17 06:40:21
【问题描述】:
我对 Scala (2.8) 很陌生,这是我在 Scala 中难以表达的东西:
我需要定义一个实现 Comparable 的类(由于与 Java 库的互操作性);它的泛型类型必须与自身或超类可比较
我还需要一个无参数构造函数以及另一个使用泛型参数的构造函数
我写了一个简单的等价物,就像我想用 Java 得到的一样:
public class MyComparable<T extends Comparable<? super T>>{
public MyComparable() {}
public MyComparable(T a){
System.out.println(a);
}
}
我可以毫无问题地在 scala REPL 中导入这个类并实例化它。
这是我在 Scala 中编写的内容,目的是尝试完成同样的事情:
import java.lang.Comparable
class MyComparable[T <: Comparable[_>:Tb],Tb]()(implicit ev: T=:=Tb) {
def this(a: T) = {
this()
println(a)
}
}
我尝试使用无参数构造函数作为默认构造函数,或者使用带有 T 参数的构造函数:在这两种情况下,我都在第 5 行得到error: could not find implicit value for parameter ev: =:=[T,Tb]
Afaik,=:= 默认是从 scala.Predef 导入的(事实上,这段代码只需要一个构造函数就可以正常工作)
【问题讨论】:
-
您最初的问题是什么?
class MyComparable[T <: Ordered[_>:T]]被拒绝了?您的 Scala 代码在概念上与您上面显示的示例 Java 代码没有太大关系。 -
我最初的问题涉及到 2 个像这样的泛型类,带有访问器/突变器,是泛型参数的 2 倍……总体而言,它更加笨重和凌乱,我可以将它粘贴到其他地方,但我已将我的问题减少到这几行,我认为使用我的原始代码不会给这个问题添加任何内容
-
我不知道你所说的“拒绝”是什么意思,但显然你不能那样写签名,否则你会得到一个循环引用。我不明白您为什么说 Scala 代码在概念上与 Java 代码不同...您愿意详细说明差异吗?
-
(由于 5 分钟的限制,添加而不是编辑)@soc 我的意思是:两者都有一个泛型参数,该参数必须与其相同的类型或超类型具有可比性,两者都有一个空的构造函数,两者有一个带有泛型参数 TI 的构造函数实际上在我的 Scala 代码中缺少的 Java 代码中留下了 System.out.println(a),这是唯一的区别 afaik,现在我已经修复了它