【问题标题】:Supplying "Class" type as a parameter to a method in Scala将“类”类型作为参数提供给 Scala 中的方法
【发布时间】:2012-11-19 21:34:30
【问题描述】:

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

public void setType(Class<T> type)

在 Java 中,我可以这样做:

someobj.setType( MyClass.class )

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    你在关注classOf[MyClass]

    【讨论】:

    • 感谢您的快速回复。我尝试使用 classOf[...] 但返回了一个更神秘的错误:类型不匹配; found : Class[MyClass](classOf[MyClass]) required: Class[Nothing] 注意: MyClass >: Nothing (and Class[MyClass](classOf[MyClass]) <: class but java-defined t>_ >: Nothing。 (SLS 3.2.10)
    • 我想你应该可以直接投射:classOf[MyClass].asInstanceOf[Class[Nothing]]
    • @PaulButcher 我不认为他想要 Class[Nothing] 的实例。
    • 我认为将其转换为 Class[Nothing] 就可以了。好吧,至少它编译没有错误。但是我现在遇到了 Java 的另一个问题 -> Scala :(
    【解决方案2】:
    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);
        }
    }
    

    斯卡拉:

    class MyClass()
    object classtest {
      val someobj = new JavaClass[MyClass]     //> someobj  : JavaClass[MyClass] = JavaClass@6d4c1103     
      someobj.setType(classOf[MyClass])               //> class MyClass
    }
    

    【讨论】:

      【解决方案3】:

      如果您只需要传递类类型并将其用于建模数据或/创建新实例,还有另一种方法。

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

      【讨论】:

      • 为什么是case class?为什么class SomeClass 不起作用?
      • 我只使用案例类进行演示,但这里任何类都可以工作
      猜你喜欢
      • 2015-12-26
      • 2023-04-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2018-01-20
      • 2016-05-02
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多