将“Class”类型作为参数提供给Scala中的方法

时间:2012-11-19 21:34:31

标签: scala

我正在通过用它重写我的一些Java代码来探索Scala。在其中一个Java方法中,我需要将类类型作为参数传递:

public void setType(Class<T> type)

在Java中,我可以通过以下方式完成:

someobj.setType( MyClass.class )

但是在Scala中,我似乎无法调用“MyClass.class”。我想知道如何在Scala中传递参数?

3 个答案:

答案 0 :(得分:8)

你在classOf[MyClass]之后。

答案 1 :(得分:0)

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类的信息来确定意图,但是像这样:

爪哇:

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
}

答案 2 :(得分:0)

如果您只需要传递类类型并使用它来建模数据或创建新实例,还有一种方法可以实现。

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]()