これはトリッキーなものです-私はscalaに実装したいJavaインターフェースを持っています:
public interface Foo {
public void bar(scala.Array arr);
}
Scalaで実装することさえ可能ですか?私が試してみると:
class FooImpl extends Foo {
override def bar(arr: Array[_]): Unit = ???
}
私は得る:
Error:(13, 7) class FooImpl needs to be abstract, since method bar
in trait Foo of type (x$1: Array)Unit is not defined
(Note that Array does not match Array[_]. To implement a raw type, use
Array[_])
class FooImpl extends Foo {
エラーメッセージは、Array
(もちろん、名前を置き換えた後)以外のジェネリック型に対する答えを示しています。
raw型を実装するには、
Array[_]
「生の型」は、Javaが型パラメーターなしで使用されるジェネリック型と呼ぶものであり、たとえばhttps://docs.oracle.com/javase/tutorial/java/generics/rawTypes.htmlは、現在、Java-5より前のコードはひどく時代遅れになっています。したがって、それがすべてのオプションである場合は、最初にJavaインターフェイスを修正する必要があります。
さて、なぜこれが機能しないのArray
ですか?これは特別なタイプであり、実際にはコンパイラに組み込まれています。そのインスタンスは実際のJVM配列であり、Javaでは一般的なタイプはありません。したがって、Scalaコードで使用される場合、コンパイルされたバイトコードはまったく使用さscala.Array
れません。静的メソッドをそこに配置するのは(egscala.Any
やとは異なりscala.Null
)JVMタイプとしてのみ存在すると思いますが、すべてのインスタンスメソッドはとして定義されていthrow new Error()
ます。エラーメッセージはこのユニークなケースを考慮に入れていなかったようです。
つまり、答えは次のとおりです。いいえ、私が知る限り、Scalaでは実装できません。ただし、Javaでも簡単に実装することはできません。また、些細な実装であっても、それを使用してコードを記述しようとすると、同じ問題が発生します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加