Scalaコンパイラがアノテーションの引数の型チェックを一部やってくれない

バグなのか仕様なのか迷ったので、一旦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オブジェクト作るのに型パラメータ渡す事自体がありえないので、

JavaでできるならScalaでもできるべきだ!」

と主張することもできないので難しい。 そもそも型パラメータ渡したところでどうやって利用するの?というと、Scalaのリフレクションだと型パラメータの中身まで取れるので(他の方法でも取れるかも?)、使おうと思えば型パラメータ含めて使えるんですよね・・・。

すでにバグ or 仕様としてどこかに議論あったら教えてください。 気が向いたらバグ報告するかもしれないし、まぁなんかクリティカルでもないというかバグだ!、という説得力が薄いので諦めるかもしれない。