特定のジェネリック型引数の使用を禁止する方法があります:廃止予定です。この場合、@Deprecated
アノテーションを使用するのは非常に不便ですが、問題(*)が解決されます。
あなたはより具体的な形で
bar(...)
の過負荷を定義し、レベル
DeprecationLevel.ERROR
に過負荷を廃止することができます
:その後
@Deprecated("bar should not be called with Qux", level = DeprecationLevel.ERROR)
fun <T : Qux> bar(t: T) = bar(t as Foo)
、bar(...)
呼び出しがQux
引数に解決され、非推奨の過負荷がかかりますそれはより具体的なタイプを特色にするからです。したがって、呼び出しはコンパイル時エラーを生成する:
bar(Qux())
^ Using 'bar(T): Unit' is an error. bar should not be called with Qux
(*)これが唯一の静的型(コールの解決に使用されるもの)としてQux
ために働くことに注意してください、、、及び関数はbar(Qux() as Foo)
と呼びます。予想されるように、引数の型が実行時にしかわからない場合、コンパイル時エラーを生成することはできません。
fun checkNotNull(x: Any?) = x ?: throw IllegalStateException("Should not be null")
@Deprecated("It is meaningless with a not-null argument.", DeprecationLevel.WARNING)
@JvmName("checkNotNull--notNullArgument")
fun checkNotNull(x: Any) = checkNotNull(x as Any?)
:-nullでないタイプでそれらを呼び出すことは意味がありませんように
同じアプローチは、唯一のいくつかの方法でnull
Sに反応する機能のためのエラーや警告を生成するために使用することができます