In Scala 2.10, data class Foo[F[_]]
, non posso scrivereSoppressione @unchecked avvertimento per un tipo esistenziale superiore kinded
scala> x.isInstanceOf[Foo[_]]
<console>:10: error: _$1 takes no type parameters, expected: one
x.isInstanceOf[Foo[_]]
^
o
scala> x.isInstanceOf[Foo[_[_]]]
<console>:11: error: _$1 does not take type parameters
x.isInstanceOf[Foo[_[_]]]
^
io posso scrivere x.isInstanceOf[Foo[F] forSome { type F[_]] }
, che dà un avvertimento non controllato. Ho provato mettendo @unchecked
annotazione in luoghi diversi, ma nessuno di loro lavoro:
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}]
^
Esiste un modo di scrivere questo tipo esistenziale, senza un avvertimento?
Penso che '@ unchecked' è solo per la corrispondenza del modello (sull'oggetto per esaustività (http://www.scala-lang.org/api/current/index.html#scala.unchecked)). Puoi comunque provare con il pattern matching, ad esempio 'obj match _: Foo [_] => ???'. –
@ GáborBakos È sorprendente che 'Foo [_]' funzioni in questo contesto, ma non in 'isInstanceOf'. Se ricordo bene, ho provato la corrispondenza del pattern in precedenza, ma usando solo 'forSome', e nessuna delle varianti che ho provato ha funzionato. –
@ GáborBakos Si prega di fare una risposta, quindi posso accettarlo. –