【问题标题】:Type mismatch runtime error on ClassTag (Scala)ClassTag (Scala) 上的类型不匹配运行时错误
【发布时间】:2017-03-22 06:19:47
【问题描述】:

我是一名 C++ 程序员,正在努力学习 Scala。我想使用 C++ 模板实现类似于以下代码的东西

template<typename T>
class Foo {
public:
    T* bar;
    /////////////////Other Code Omitted//////////////////////////
};

它在 Scala 中的对应部分由于类型擦除而无法编译

class Foo[E](){
    val bar = new E() //Will not compile 
}

我整晚都在寻找解决方法,这似乎是其中之一

package test
import scala.reflect._

object Type {
  def newInstance[T: ClassTag](init_args: AnyRef*): T = {
    classTag[T].runtimeClass.getConstructors.head.newInstance(init_args: _*).asInstanceOf[T]
  }
}

class Foo[T1:ClassTag](init_args: AnyRef*){
  val bar = Type.newInstance[T1](init_args)
}

class TestClass(val arg:String){
  val data = arg
}

但是,当我尝试在 scala 控制台中实例化一个 (val test = new Foo[Test]("test")) 时,会出现以下错误

java.lang.IllegalArgumentException: argument type mismatch
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
  at ParActor.Type$.newInstance(ParActor.scala:32)
  at ParActor.Foo.<init>(ParActor.scala:37)
  ... 35 elided

我不确定是什么导致了问题以及如何解决这个问题。也欢迎其他解决方法。

【问题讨论】:

  • 不确定,但Type.newInstance[T1](init_args: _*) 有影响吗?
  • @Jasper-M 现在试试。
  • @Jasper-M 很有魅力!你能帮我解释一下有什么区别(什么是:_*)吗?非常感谢!
  • 我会把它变成一个答案。

标签: scala type-erasure


【解决方案1】:

你应该转

Type.newInstance[T1](init_args)

进入

Type.newInstance[T1](init_args: _*)

: _* 所做的是将列表或序列转换为可变参数参数。可变参数AnyRef* 实际上是IndexedSeq[AnyRef],更具体地说是WrappedArray[AnyRef]。因此,当您将init_args 作为参数传递给newInstance 而不告诉编译器将其解释为可变参数时,您实际上是在传递WrappedArray(WrappedArray("test"))

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多