バグなのか仕様なのか迷ったので、一旦blogにメモしておきます。
以下で @ScalaAnnotation(clazz = classOf[A[String]])
の部分がコンパイルエラーになってほしいけど、なってくれない・・・。
条件は
- Scala 2.10.7, 2.11.12, 2.12.8, 2.13.0 全部で同じ
- JDK8(たぶん関係ないが)
- sbt 1.2.8(これもたぶん関係ないが)
- Javaでアノテーション定義しても同じ
package example import scala.annotation.StaticAnnotation class ScalaAnnotation(clazz: Class[_]) extends StaticAnnotation class A[B <: Int] object Main { // compile error // type arguments [String] do not conform to trait A's type parameter bounds [B <: Int] // val x = classOf[A[String]] // expect fail. but success !? @ScalaAnnotation(clazz = classOf[A[String]]) def foo: Int = 42 }
Javaで同じことやろうとすると、そもそも A.class
と書くだけで、java.lang.Classオブジェクト作るのに型パラメータ渡す事自体がありえないので、
と主張することもできないので難しい。 そもそも型パラメータ渡したところでどうやって利用するの?というと、Scalaのリフレクションだと型パラメータの中身まで取れるので(他の方法でも取れるかも?)、使おうと思えば型パラメータ含めて使えるんですよね・・・。
すでにバグ or 仕様としてどこかに議論あったら教えてください。 気が向いたらバグ報告するかもしれないし、まぁなんかクリティカルでもないというかバグだ!、という説得力が薄いので諦めるかもしれない。