2015-01-27 22 views
5

In Scala 2.10 gegeben class Foo[F[_]] ich nichtUnterdrückung @unchecked Warnung für einen höheren kinded existentiellen Typen

scala> x.isInstanceOf[Foo[_]] 
<console>:10: error: _$1 takes no type parameters, expected: one 
       x.isInstanceOf[Foo[_]] 
           ^

oder

scala> x.isInstanceOf[Foo[_[_]]] 
<console>:11: error: _$1 does not take type parameters 
       x.isInstanceOf[Foo[_[_]]] 
           ^

schreiben kann ich kannx.isInstanceOf[Foo[F] forSome { type F[_]] } schreiben, das gibt eine ungeprüfte Warnung. Ich habe @unchecked Anmerkung an verschiedenen Orten versucht Platzierung, aber keiner von ihnen arbeiten:

scala> x.isInstanceOf[Foo[H] @unchecked forSome {type H[_]}] 
<console>:11: warning: abstract type H in type Foo[H] @unchecked forSome { type H[_] <: Any } is unchecked since it is eliminated by erasure 
       x.isInstanceOf[Foo[H] @unchecked forSome {type H[_]}] 
          ^

scala> x.isInstanceOf[Foo[H @unchecked] forSome {type H[_]}] 
<console>:11: warning: abstract type H in type Foo[H @unchecked] is unchecked since it is eliminated by erasure 
       x.isInstanceOf[Foo[H @unchecked] forSome {type H[_]}] 
          ^
<console>:11: error: kinds of the type arguments (? @unchecked) do not conform to the expected kinds of the type parameters (type F) in class Foo. 
? @unchecked's type parameters do not match type F's expected parameters: 
<none> has no type parameters, but type F has one 
       x.isInstanceOf[Foo[H @unchecked] forSome {type H[_]}] 
              ^

scala> x.isInstanceOf[Foo[H] forSome {type H[_] @unchecked}] 
<console>:1: error: `=', `>:', or `<:' expected 
     x.isInstanceOf[Foo[H] forSome {type H[_] @unchecked}] 
               ^

Gibt es eine Möglichkeit, diese existenzielle Art ohne eine Warnung zu schreiben?

+2

Ich denke '@ unchecked' ist nur für Mustervergleich (auf dem Objekt für die Vollständigkeit (http://www.scala-lang.org/api/current/index.html#scala.unchecked)). Sie können es mit einem Mustervergleich versuchen, wie 'obj match _: Foo [_] => ???'. –

+0

@ GáborBakos Es ist überraschend, dass 'Foo [_]' in diesem Kontext funktioniert, aber nicht in 'isInstanceOf'. Wenn ich mich richtig erinnere, habe ich vorher versucht, einen Mustervergleich durchzuführen, aber nur 'forSome' verwendet, und keine der Variationen, die ich versucht habe, funktioniert. –

+0

@ GáborBakos Bitte machen Sie dies eine Antwort, damit ich es akzeptieren kann. –

Antwort

1

Mit Mustervergleich können Sie die Warnungen fernhalten:

x match {case _: Foo[_] => ???} 

Es ist auch ein bisschen weniger ausführlich in meiner Meinung nach. Wenn Sie die Variable case (beginnend mit Kleinbuchstaben oder mit zurückgebliebenen Anführungszeichen versehen, dh nicht _ wie im obigen Beispiel vor :) benennen, haben Sie bereits eine asInstanceOf.

2

Art zu raten:

$ scala210 -language:_ 
Welcome to Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.7.0_65). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> class Foo[F[_]] 
defined class Foo 

scala> (null: Any).isInstanceOf[(Foo[F] forSome { type F[_] }) @unchecked] 
res0: Boolean = false 

Das Pop-up hat mir nur gesagt Codeblöcke sind nicht sehr informativ.

Oh, und s/guessing/experimenting.

+0

Für mich funktioniert es in Scala 2.10, aber nicht in 2.11.5 (ich bekomme die übliche Warnung). – Kolmar

+0

@Kolmar Gabor's Antwort funktioniert auch für 2.11. –