問題タブ [scala-java-interop]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Javaでscala Listを直接使用できますか?
次のように、Java で scala List を使用できますか。
コンパイルされていないようです。List$.apply メソッドが見つかりません。
に変更すると
ここで、Dir は私の scala クラスであり、ls() は scala List を返します。
「内部コンパイラ エラー: java.lang.ClassCastException: org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding は、org.eclipse.jdt.internal で org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding にキャストできません。 compiler.lookup.BinaryTypeBinding.initializeTypeVariable(BinaryTypeBinding.java:927)"
私はそれが何を意味するのか分かりません。
ライブラリを scala で書きたいのですが、それを Java でも使用したいと考えています。
私のscalaクラスには、scala Listを返すメソッドがあり、Javaコードでそれらを使用するには、2つのオプションがあります。
javaでscala Listを直接使用する
これらのメソッドの java.util.List を返すラッパー クラスを記述します。
オプション 1 が望ましいです。そうしないと、ほぼすべての scala クラスのラッパー クラスを作成する必要があります。
しかし、Java で実行されている scala List を取得できません。
scala - Scala から型とサブクラスの Java コレクションを返す
私は次のようなJavaのインターフェースを持っています:
このインターフェイスを Scala 2.8 で実装する必要があり、現在、次のようなことを行っています。
しかし、これはコンパイルされず、コンパイラは次のように言います:
この問題を回避する方法はありますか?
アップデート:
私は次のことを試しましたが、まだ運がありません:
この後者の場合、次のようになります。
scala - Scala から java.util.Map を使用する
次のメソッドで Java レガシー コードを使用する必要があります。
私のScalaコード:
利回り =>
型の不一致; 見つかった: java.util.HashMap[String, Any] 必須: java.util.HashMap[java.lang.String, java.Object]
だから私はそれを次のように変更します:
利回り =>
型の不一致; found : Char 必須: java.lang.Object 注: プリミティブ型は暗黙的に AnyRef に変換されません。x.asInstanceOf[AnyRef] をキャストすることで安全にボクシングを強制できます。
それで、最終的に私は次のことを思いつきました:
これに対処するためのより簡潔な方法はありますか?
scala - Scala から一連の静的 Java メソッドへの参照を保存するにはどうすればよいですか?
Eclipse データバインディングのコンテキストでは、オブジェクトのファクトリとして機能する Java クラスがかなりありIObservable
ます。たとえばBeanObservables
、PojoObservables
、EMFObservables
、 などがあり、それらはすべて次のような一連のメソッドを実装しています。
Scala の世界にいた場合、これらのファクトリのそれぞれは、たとえば などの共通のトレイトを実装するシングルトン オブジェクトになるでしょう。IObservableFactory
たとえば、データ バインディングを作成するためにそれらを使用するメソッドに暗黙的な値としてそれらを渡すことができます。 .
しかし、それらはJavaで定義されているため、私にはそれができないようです。書けない
PojoObservables
は値として認識されないためです。
PojoObservables
コンパイラが Scala のクラスに対応するシングルトンを「インスタンス化」する方法はありますか? またはそれに対する回避策はありますか?自分でシングルトンを作成してすべてのメソッド呼び出しを転送できることはわかっていますが、これは少し面倒に思えます。
編集
わかりやすくするために、これが私がやろうとしていることです: 渡されたファクトリを使用して監視可能な値を作成するメソッドを定義します。
しかし、静的メソッドのみを持つJavaクラスをこのメソッドに定義するObservableFactory
方法や実際に渡す方法はわかりません。PojoObservables
createObservable
scala - Scalaで、Javaで定義されたクラスのコンパニオンオブジェクトを定義するにはどうすればよいですか?
モデリングツールによって生成されたJavaクラスに暗黙の変換を追加したいと思います。そこで、それらをそれらのクラスのコンパニオンオブジェクトに追加して、コンパイラが自動的にそれらを検出できるようにします。ただし、コンパニオンは同じファイルで定義する必要があるため、別のファイルに追加することはできません。これについて私にできることはありますか?
もちろん、すべての暗黙的な変換を別のオブジェクトで定義してからスコープに入れることもできますが、これには追加のインポートが必要です。他の解決策はありますか?
scala - クラス階層にraw型があるのに、なぜScalaは不正な継承について文句を言うのですか?
Scalaを受け取り、 Eclipse /JFaceDatabindingフレームワークObservableBuffer
と互換性のあるイベントを発生させるラッパーを作成しています。
ObservableList
データバインディングフレームワークには、通常のJavaリストを装飾する抽象があります。この基本クラスを再利用したかったのですが、この単純なコードでさえ失敗します。
エラーあり:
なんで?それは生のタイプと関係がありますか?raw型を拡張するをObservableList
実装します。これは予想される動作ですか。どのように回避できますか?IObservableList
java.util.List
scala - このタイプの警告/エラーを取り除くにはどうすればよいですか?
スクリプトがあります。警告なしで実行されます。
ループを独自の関数に抽出したいと思います。だから私はそれを試してみます。
ループが独自の機能を持っているということは、より具体的なタイプが必要であることを意味します。わかった。
java.util.Map [AnyRef, AnyRef]
の代わりに試してみますjava.util.Map [_, _]
。
これで実行されますが、警告が表示されます。その警告を取り除くにはどうすればよいですか?
ノート:
- org.yaml.snakeyaml.YamlはJavaで記述されているため、タイプマニフェストを使用できません。(できますか?)
- 私の実際のプログラムはいくつかのJavaライブラリを使用しているので、与えられているタイプについて誤った仮定をする可能性がある場合は警告が必要です。しかし、コンパイラに「はい、これを確認しました。正しいです。再度警告しないでください」とどのように伝えるのでしょうか。
- 私はscala2.7.7を使用しています(これはUbuntuにパッケージされているバージョンだからです)。
generics - 2つの結合されたScalaジェネリック型コンストラクターは、どのようにして相互に型パラメーターとして参照できますか?
Java 1.6.0_21では、以下の最初の例は正常にコンパイルされます。これは、パラメーター型の境界がむき出しになっているためだと思います。つまり、以下にバインドされている「Z extends Zen」では、Javaにより、Zenは生の非ジェネリック型(ランタイムの「消去された」型に相当)の名前としてスライドできます。これは間違っていて悪いことかもしれませんが、バスに乗って家に帰るのに役立つか、少なくとも奇抜な楽しい時間になることもあります。
Scala 2.8.0.finalでは、以下はCleanOceanWithFishを介して優れたコンパイルを行い、いくつかの基本的な型パラメーターのフックアップを示しています。しかし、ZenとTaoが相互に依存するジェネリック型になると、Scalaコンパイラーは私のウィービング構造を拒否します。コメントのコンパイラエラーを参照してください。
では、どうすればScala(2.8.0)の結び目をTaoとZenの間で適切に結ぶことができますか?
これは確かに不自然な例ですが、私が本当に望んでいるのは、Scalaを使用して、上記の形式で作業している実際のJavaタイプを拡張することです(これまでのところ、「forSome」と「[_]」を介した既存のタイプは役に立ちません) )。ZenとTaoをScalaでコンパイルすることで、おそらくそのJava拡張機能への道が示されると思います。答えの中でJava拡張機能の問題を検討できるのであれば、はるかに優れています。助けてくれてありがとう!
NikitaS.とKrisN.からの以下の非常に役立つ最初の2つの回答の後に投稿された更新。
さまざまなJava+Scala共参照シナリオについて経験的に学びました。結果として、JavaとScalaの両方で相互運用可能なコアフェレント型が必要な場合、このJava構造は次のようになります。
一番上の最初のJavaの例よりも具体的なタイピングを提供し(生のタイプを回避)、Scalaでは次のように適切に拡張できます。
これらに基づいて単純な具象型を作成し、それらをインスタンス化し、それらのメソッドを呼び出すことができることを確認しました。JavaとScalaの両方で重要なステップは、型パラメーターツリーが現在の宣言型にループバックするポイントに境界付きワイルドカードを配置することです。つまり、Javaでは「?extends」、Scalaでは「_ <:」です。
scala - 静的内部クラスと同じ名前のクラスの静的フィールドを参照する Scala-Java の非互換性
次の Java クラスを使用します。
この Java コードは次のように機能します。
しかし、Scala から呼び出す:
コンパイラ エラーが発生します。
誰かがこれを回避する方法を知っていますか、それとも静的フィールドの名前を変更する必要がありますか?
-- アンドレアス
scala - java.lang.Iteratorから不変のリストを作成します
一致する要素を抽出するために、ライブラリ(JXPath )を使用してBeanのグラフをクエリしています。ただし、JXPathは一致する要素のグループをjava.lang.Iteratorのインスタンスとして返すため、不変のscalaリストに変換したいと思います。イテレータを反復処理し、各反復ステップで新しい不変リストを作成するよりも簡単な方法はありますか?