this questionを見て、get
またはset
への@Throws
の適用は無効です。@ターゲットがプロパティのときには効果がありません
はさらに、@Throws
ためのみ有効なターゲットはAnnotationTarget.FUNCTION
、AnnotationTarget.PROPERTY_GETTER
、AnnotationTarget.PROPERTY_SETTER
、およびAnnotationTarget.CONSTRUCTOR
です。
JPAアノテーションやDeprecated
などの他のアノテーションは、このメソッドに正しく適用されています。
これは異常な動作です。
私がデモンストレーションするために、Javaで単純な抽象クラスを作成しました。コンストラクタ、メソッド、getメソッドがそれぞれ1つずつありました。
public abstract class JavaAbstractClass {
@Deprecated
@NotNull public abstract String getString() throws IOException;
public abstract void setString(@NotNull String string) throws IOException;
public abstract void throwsFunction() throws IOException;
public JavaAbstractClass() throws IOException {
}
}
あなたが見ることができるように、すべてのメソッド/コンストラクタがIOException
を投げるとしてマークされています。
、私はKotlinの等価クラスを作成し、相互運用のためのthrows
との適切な方法をマークしようと、生成されたgetString
とsetString
方法は何throws
句を持っていません。
abstract class KotlinAbstractClass @Throws(IOException::class) constructor() {
@get:Deprecated("Deprecated")
@get:Throws(IOException::class)
@set:Throws(IOException::class)
abstract var string: String
@Throws(IOException::class)
abstract fun throwsFunction()
}
逆コンパイルコード:
@Metadata(Some metadata here)
public abstract class KotlinAbstractClass {
/** @deprecated */
@Deprecated(
message = "Deprecated"
) // @Deprecated made it through!
@NotNull
public abstract String getString(); // Nothing here!
public abstract void setString(@NotNull String var1); // Nothing here!
public abstract void throwsFunction() throws IOException;
public KotlinAbstractClass() throws IOException {
}
}
私にとって、これらの内部のアノテーションではなくメソッドに直接適用されるので、コンパイラによって特別に扱わなければならないためと考えられます。
また、非抽象プロパティのゲッターにそれを適用する:
val string: String
@Throws(IOException::class) get() = "Foo"
はは署名public final String getString() throws IOException
持つメソッドを生成しません!
このケースは正しく処理されていない可能性がありますか?
これはバグですか?
注:これは、このメソッドが実際にこの例外をスローするかどうかとは関係ありません。
は私が行う場合:
@get:Throws(IOException::class)
val string: String
get() = BufferedReader(FileReader("file.txt")).readText()
コンパイルされたコードはFileReader
constructorがFileNotFoundException
スローという事実にもかかわらず、まだ
@NotNull
public final String getString() {
return TextStreamsKt.readText((Reader)(new BufferedReader((Reader)(new FileReader("file.txt")))));
}
です。
さらに、抽象メソッドの場合は、実装を行うことができず、throws
節を持つことができるため、これは重要ではありません。
私は@tynnが示唆するように行い、具体的な実装を追加した場合:
class ConcreteClass : KotlinAbstractClass() {
override val string: String
get() = BufferedReader(FileReader("file.txt")).readText()
...
}
を、私はまだ同じ結果を得ます。
実際にこの例外をスローするゲッターまたはセッターを実装しようとします。あなたのコードが安全であれば、あなたが上書きするものの 'throws'宣言を再宣言する必要はありません。たぶん_Kotlin_は '@ Throws'アノテーションでちょうど巧妙です。 – tynn
@tynn私は私の質問を編集します。 – Moira