2014-02-07 5 views
6

Ich stolperte über ein rätselhaftes Verhalten von Type.=:=, wenn es auf Typreparaturen angewendet wurde. Bedenken Sie:Strukturelle Verfeinerung und Typgleichheit

import reflect.runtime.universe._ 
type T1 = AnyRef { 
    def apply(name: String): Unit 
    def foo: String 
} 

type Base = { def apply(name: String): Unit } 
type T2 = Base { 
    def foo: String 
} 

Da Base ist ein Alias ​​für eine Art Verfeinerung, würde ich erwarten, dass die Verfeinerung es weiter durch das Element Zugabe foo würde die gleiche Art ergeben, wie wenn ich foo rechts in Base definiert hatte.

Oder mit anderen Worten, ich würde erwarten, dass T1 und T2 völlig äquivalente Typen bezeichnen.

In den meisten Fällen scheint scalac zuzustimmen. Mit dem Beispiel ich eine Instanz von T2 passieren kann, wenn eine Instanz von T1 erwartet wird:

def f(x: T1){} 
f(null: T2) // scalac does not complain here 

Und umgekehrt:

def g(x: T2){} 
g(null: T1) // scalac is still happy 

ich auch für einen Beweis stellen kann T1 =:= T2 und kompiliert es auch in Ordnung:

implicitly[T1 =:= T2] 

jedoch, scala Reflexion ich mit ge t ganz andere Ergebnisse:

scala> typeOf[T1] =:= typeOf[T2] 
res2: Boolean = false 

Das ist also ein scala Reflexion Fehler (ich würde vermuten, so) oder ist es ein wesentlicher Grund (technisch von anderen Gründen), warum typeOf[T1] =:= typeOf[T2] würde false zurück?

+0

'typeOf [T1] <:

+0

Das ist eine nette Beobachtung. Zumindest gibt es dann etwas Konsistenz. Die andere großartige Sache ist, dass es mir zumindest einen Workaround bietet: Ich kann einfach nach '(typeOf [T1] <:

Antwort

4

Leider sieht es dieser Fehler zu sein: https://issues.scala-lang.org/browse/SI-8177

Auf der positiven Seite ... es sieht aus wie es gibt Arbeit aktiv im Gange, es zu beheben :)

+0

+1 für das Zeigen auf verwandte Fehler. Aber ich bin mir nicht sicher, dass das der Fehler ist, den ich erlebe. In SI-8177 geht es um abhängige Typen und eine ungültige Behandlung von Typpräfixen. Der einzige Weg, wie ich denken kann, dass dies Auswirkungen auf meinen obigen Codeausschnitt hat, ist, dass meine Typ-Aliase unterschiedliche Präfixe haben. Dies ist in der Tat der Fall in der REPL, aber ich habe versucht, alle Definitionen in das gleiche Objekt (=> dasselbe Präfix) zu wickeln, und ich bekomme immer noch den gleichen Fehler. Es ist möglich, dass das Fixieren von SI-8177 mein Problem als Nebeneffekt beheben wird. Ich werde versuchen, mit 2.11.0-RC1, wenn es aus ist, und wenn behoben, werde ich Ihre Antwort validieren. –

+0

OK, scala 2.11.0-RC1 wurde gerade veröffentlicht, also habe ich es versucht (SI-8177 ist in scala 2.11.0-RC1 als behoben markiert). Der Fehler ist definitiv immer noch da, so wie ich vermutete SI-8177 deckt nicht mein beschriebenes Problem. Vielleicht ist es Zeit, ein Ticket zu öffnen. –

Verwandte Themen