抑制更高种类的存在类型的@unchecked 警告
Suppressing @unchecked warning for a higher-kinded existential type
在 Scala 2.10 中,给定 class Foo[F[_]]
,我不能写
scala> x.isInstanceOf[Foo[_]]
<console>:10: error: _ takes no type parameters, expected: one
x.isInstanceOf[Foo[_]]
^
或
scala> x.isInstanceOf[Foo[_[_]]]
<console>:11: error: _ does not take type parameters
x.isInstanceOf[Foo[_[_]]]
^
I can write x.isInstanceOf[Foo[F] forSome { type F[_]] }
,这给出了未经检查的警告。我试过在不同的地方放置 @unchecked
注释,但其中 none 有效:
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}]
^
有没有办法在没有警告的情况下编写这种存在类型?
猜测种类:
$ 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
弹出窗口刚刚告诉我代码块信息量不大。
哦,还有 s/guessing/experimenting
。
通过模式匹配,您可以远离警告:
x match {case _: Foo[_] => ???}
我认为它也不那么冗长。如果您命名 case
变量(以小写字母开头或使用反引号转义,即不是 _
,如上例 :
之前),您已经有一个 asInstanceOf
.
在 Scala 2.10 中,给定 class Foo[F[_]]
,我不能写
scala> x.isInstanceOf[Foo[_]]
<console>:10: error: _ takes no type parameters, expected: one
x.isInstanceOf[Foo[_]]
^
或
scala> x.isInstanceOf[Foo[_[_]]]
<console>:11: error: _ does not take type parameters
x.isInstanceOf[Foo[_[_]]]
^
I can write x.isInstanceOf[Foo[F] forSome { type F[_]] }
,这给出了未经检查的警告。我试过在不同的地方放置 @unchecked
注释,但其中 none 有效:
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}]
^
有没有办法在没有警告的情况下编写这种存在类型?
猜测种类:
$ 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
弹出窗口刚刚告诉我代码块信息量不大。
哦,还有 s/guessing/experimenting
。
通过模式匹配,您可以远离警告:
x match {case _: Foo[_] => ???}
我认为它也不那么冗长。如果您命名 case
变量(以小写字母开头或使用反引号转义,即不是 _
,如上例 :
之前),您已经有一个 asInstanceOf
.