Auf Thema antworten

Das ist ein typisches Varianzen-Problem. Warum das nicht funktioniert ist schwer zu erklären, weil man davor erst den Sinn von Varianzen verstanden haben sollte.


Ich hab für mein Scala Tutorial mal angefangen einen Beitrag über Varianzen zu schreiben, bin bisher aber nicht dazu gekommen ihn fertig zu stellen, weshalb er noch nicht öffentlich zugänglich ist. Vllt. bekomme ich das die nächsten Tage hin, dann werde ich dir den Link dazu schicken.


Aber jetzt zu deinem Problem: Das was du vorhast wird nie funktionieren. Der Compiler kann nicht garantieren, dass deine Map einen Converter zurück gibt, der mit dem übergebenen Typ klarkommt.


Wenn der Compiler das zur Compilezeit aber garantieren soll (also so, dass du zur Laufzeit nicht casten musst), dann ist es möglich, das in Scala über impliziter Parameter zu regeln:


[CODE]object Converts {


  trait Converter[A] {

    def convert(in: A): String

  }


  implicit object IntConverter extends Converter[Int] {

    def convert(in: Int): String = in.toString

  }


  implicit object DoubleConverter extends Converter[Double] {

    def convert(in: Double): String = in.toString

  }


  def convert[A](x: A)(implicit c: Converter[A]) = c.convert(x)

}


import Converts._


convert(3)

convert(6.48)

convert("does not work")

[/CODE]



Oben