2017-02-16 4 views
1

が、私は一般的な機能を持っていると仮定します。パラメータタイプの特定のサブタイプを持つ関数呼び出しを禁止する方法はありますか?

fun <T: Foo> bar(t: T) { ... } 

その後、後のある時点で、私がある、Quxとして専門Tbar(...)を呼び出すために、それは無意味(あるいは誤った)であると判断し、当然のことながら、Fooのサブタイプの1つです。しかし、私はクラス階層を変更しないという強い理由があります(例えば、私はそのコードにアクセスできません)。

bar(t)への呼び出しを禁止する方法はありますかTQuxに特化していますか?

答えて

3

特定のジェネリック型引数の使用を禁止する方法があります:廃止予定です。この場合、@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に反応する機能のためのエラーや警告を生成するために使用することができます

関連する問題