私はJavaコードの一部をScalaで書き直して、Scalaを探索しています。Javaメソッドの1つで、クラスタイプをパラメーターとして渡す必要があります。
public void setType(Class<T> type)
Javaでは、次の方法で実行できます。
someobj.setType( MyClass.class )
しかし、Scalaでは「MyClass.class」とは呼べないようです。Scalaでパラメーターを渡すにはどうすればよいですか?
私はJavaコードの一部をScalaで書き直して、Scalaを探索しています。Javaメソッドの1つで、クラスタイプをパラメーターとして渡す必要があります。
public void setType(Class<T> type)
Javaでは、次の方法で実行できます。
someobj.setType( MyClass.class )
しかし、Scalaでは「MyClass.class」とは呼べないようです。Scalaでパラメーターを渡すにはどうすればよいですか?
あなたは後classOf[MyClass]
です。
scala> case class MyClass()
defined class MyClass
scala> def setType[T](t:Class[T]) = println(t)
setType: [T](t: Class[T])Unit
scala> setType(classOf[MyClass])
class $line23.$read$$iw$$iw$MyClass
Philippeは、OPがScalaからJavaメソッドを呼び出す必要があることを正しく指摘しています。その場合、インテントを決定するためにJavaクラスに関する詳細情報が必要ですが、次のようなものです。
Java:
public class JavaClass<T> {
public void setType(Class<T> type) {
System.out.println(type);
}
}
Scala:
class MyClass()
object classtest {
val someobj = new JavaClass[MyClass] //> someobj : JavaClass[MyClass] = JavaClass@6d4c1103
someobj.setType(classOf[MyClass]) //> class MyClass
}
クラスタイプを渡し、それを使用してデータをモデル化するか、新しいインスタンスを作成する必要がある場合は、もう1つの方法があります。
def doSomeThing[T](id: UUID, time: Date): List[T] = {
// do anything with T, it's a reference to class definition not an instance
List(T(id, time), T(id, new Date(time.getTime + 900 * 1000))
}
case class SomeClassA(id: UUID, time: Date)
case class SomeClassB(id: UUID, time: Date)
class NonCaseClass(p1: UUID, p2: Date)
doSomeThing[SomeClassA]()
doSomeThing[SomeClassB]()
doSomeThing[NonCaseClass]()
このコードを少し複雑にしました。ラッパーのみの例を次に示します。
def doSomeThing[T]() = {
// do anything with T, it's a reference to class definition not an instance
}
case class SomeClassA(id: UUID, time: Date)
doSomeThing[SomeClassA]()