在C#中,我可以重载泛型类型的方法,如下面的示例所示:
// http://ideone.com/QVooD
using System;
using System.Collections.Generic;
public class Test {
public static void Foo(List<int> ints) {
Console.WriteLine("I just print");
}
public static void Foo(List<double> doubles) {
Console.WriteLine("I iterate over list and print it.");
foreach(var x in doubles)
Console.WriteLine(x);
}
public static void Main(string[] args) {
Foo(new List<int> {1, 2});
Foo(new List<double> {3.4, 1.2});
}
}然而,如果我尝试在Scala中做同样的事情,它将引发一个编译时错误,由于擦除,List[Int]和List[Double]将擦除为同一类型。我听说Scala的Manifest可以用来解决这个问题,但我不知道如何解决。我也没有在文档中找到任何有用的东西。
因此,我的问题是:如何使用Manifests (或其他有效方法)重载因擦除而擦除为同一类型的泛型类型的方法?
发布于 2011-02-13 13:44:48
Manifest也没有真正的帮助,因为它们在擦除后将具有相同的类型。
什么将有助于拥有不同数量的参数(或擦除后的不同类型)。我发现使用不同数量的隐式参数可以透明地解决这个问题,并且通过使用scala.Predef.DummyImplicit,您甚至不需要在任何地方导入隐式参数。
class Test{
def foo(ints : List[Int])
def foo(doubles : List[Double])(implicit i1:DummyImplicit)
def foo(strings : List[String])(implicit i1:DummyImplicit, i2:DummyImplicit)
}发布于 2011-02-14 16:50:46
在Scala中,您不会这样做。考虑到JVM的限制,为什么要尝试模拟那些永远不能正常工作的东西呢?尝试使用惯用的Scala:
trait Fooable[T] {
def foo : Unit
}
object IntListFoo extends Fooable[List[Int]] {
def foo {
println("I just print")
}
}
class DoubleListFoo(val l : List[Double]) extends Fooable[List[Double]] {
def foo {
println("I iterate over list and print it.")
l.foreach { e =>
println(e)
}
}
}
implicit def intlist2fooable(l : List[Int]) = IntListFoo
implicit def doublelist2fooable(l : List[Double]) = new DoubleListFoo(l)然后,您可以执行如下代码
List(1,2,3,4).foo
List(1.0,2.0,3.0).foo发布于 2011-02-13 23:29:22
有点老套,两个方法都需要相同的返回类型(这里:Unit)……
def fooInt(list: List[Int]) = println("int")
def fooDouble(list: List[Double]) = println("double")
def foo[N <: AnyVal](list:List[N])(implicit m:ClassManifest[N]) = m.erasure match {
case c if c == classOf[Int] => fooInt(list.asInstanceOf[List[Int]])
case c if c == classOf[Double] => fooDouble(list.asInstanceOf[List[Double]])
case _ => error("No soup for you!")
}
foo(List(1,2,3,4))
//--> int
foo(List(1.0,2.0,3.0))
//--> doublehttps://stackoverflow.com/questions/4982552
复制相似问题