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?
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 [_] => ???'. –
@ 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. –
@ GáborBakos Bitte machen Sie dies eine Antwort, damit ich es akzeptieren kann. –