[解決済み] Java java.lang.Class<T> Object の Scala 版。
質問
質問は例によって説明するのが一番です。
JavaでJPA EntityManagerを使用する場合、次のようになります(Accountは私のEntityクラスです)。
Account result = manager.find(Account.class, primaryKey);
Scalaで、私の素朴な試みは。
val result = manager.find(Account.class, primaryKey)
しかし
Account.class
をScalaで使用すると、このようなことはないようです。 ScalaでAccountクラスのjava.lang.Classオブジェクトを指定するにはどうしたらいいでしょうか?
どのように解決するのですか?
によると、" Scalaの型システム "です。
val c = new C
val clazz = c.getClass // method from java.lang.Object
val clazz2 = classOf[C] // Scala method: classOf[C] ~ C.class
val methods = clazz.getMethods // method from java.lang.Class<T>
は
classOf[T]
メソッドはScalaの型の実行時表現を返します。これは,Javaの式T.class
.
使用方法classOf[T]
は、情報が欲しい型がある場合に便利なのに対してgetClass
は、その型のインスタンスから同じ情報を取得するのに便利です。
しかし
classOf[T]
と
getClass
は、getClassの場合、JVM上の型消去の効果を反映して、わずかに異なる値を返します。
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
そのため 以下は動作しません。 :
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
があります。
の戻り値の型に関するチケットです。
getClass
.
(
ジェームス・ムーア
によると、このチケットは2011年11月、つまり2年後に修正されているとのことです。
2.9.1では
getClass
ができるようになりました。
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
2009年当時
Scala が getClass() の戻り値を java.lang.Class[T] forSome { val T : C } として扱ってくれたら便利なのだが,ここで C は getClass が呼ばれた式の静的型の消去のようなものである.
これによって、クラスのイントロスペクションをしたいが、クラスのインスタンスは必要ない、次のようなことができるようになります。
また、イントロスペクトするクラスの種類を限定したいので、Class[_ <: Foo]を使っています。しかし、これではキャストせずにFoo.getClass()を使ってFooクラスを渡すことができません。
注
getClass
は、可能な回避策となる。
class NiceObject[T <: AnyRef](x : T) {
def niceClass : Class[_ <: T] = x.getClass.asInstanceOf[Class[T]]
}
implicit def toNiceObject[T <: AnyRef](x : T) = new NiceObject(x)
scala> "Hello world".niceClass
res11: java.lang.Class[_ <: java.lang.String] = class java.lang.String
関連
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
JSPで「リストが型解決できない!」の解決方法
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
java の例外が発生しました java
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
[解決済み】Scalaの型消去を回避するにはどうしたらいいですか?または、なぜ私のコレクションの型パラメータを取得することができないのですか?