Ich habe das nicht getestet, aber warum sollte eine Obergrenze nicht funktionieren?
def foo[T <: String](s: List[T]) { println("Strings: " + s) }
def foo[T <: Int](i: List[T]) { println("Ints: " + i) }
Wechselt die Löschübersetzung zweimal von foo (Liste [Beliebig]) zu foo (Liste [Zeichenfolge]) und foo (Liste [Int] i):
http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ108
Ich glaube, ich habe gelesen, dass in Version 2.8 die Obergrenzen jetzt so codiert sind, anstatt immer ein Any.
Um kovariante Typen zu überladen, verwenden Sie eine invariante Grenze (gibt es eine solche Syntax in Scala? ... ah, ich glaube nicht, aber nehmen Sie Folgendes als konzeptionellen Nachtrag zur obigen Hauptlösung):
def foo[T : String](s: List[T]) { println("Strings: " + s) }
def foo[T : String2](s: List[T]) { println("String2s: " + s) }
dann nehme ich an, dass das implizite Casting in der gelöschten Version des Codes beseitigt ist.
UPDATE: Das Problem ist, dass JVM mehr Typinformationen zu Methodensignaturen löscht als "notwendig". Ich habe einen Link bereitgestellt. Es löscht Typvariablen aus Typkonstruktoren, sogar die konkrete Grenze dieser Typvariablen. Es gibt eine konzeptionelle Unterscheidung, da das Löschen des gebundenen Funktionstyps keinen konzeptionellen, nicht reifizierten Vorteil hat, da er zur Kompilierungszeit bekannt ist und sich mit keiner Instanz des Generikums ändert und Anrufer nicht aufrufen müssen Die Funktion mit Typen, die nicht der Typbindung entsprechen. Wie kann die JVM die Typbindung erzwingen, wenn sie gelöscht wird? Gut ein Linksagt, dass der gebundene Typ in Metadaten beibehalten wird, auf die Compiler zugreifen sollen. Dies erklärt, warum die Verwendung von Typgrenzen keine Überladung ermöglicht. Dies bedeutet auch, dass JVM eine weit offene Sicherheitslücke ist, da typgebundene Methoden ohne Typgrenzen aufgerufen werden können (Huch!). Entschuldigen Sie mich, dass die JVM-Designer so etwas unsicheres nicht tun würden.
Als ich das schrieb, verstand ich nicht, dass Stackoverflow ein System ist, bei dem Menschen nach der Qualität der Antworten bewertet werden, wie etwa ein Wettbewerb um den Ruf. Ich dachte, es wäre ein Ort, um Informationen auszutauschen. Zu der Zeit, als ich dies schrieb, verglich ich reifiziertes und nicht-reifiziertes von einer konzeptionellen Ebene (Vergleich vieler verschiedener Sprachen), und daher machte es meiner Meinung nach keinen Sinn, den gebundenen Typ zu löschen.