为了避免Java异常,我正在使用Scala的异常处理类。
但是,在编译以下代码段时:
import scala.util.control.Exception._
val cls = classManifest[T].erasure
// Invoke special constructor if it's available. Otherwise use default constructor.
allCatch opt cls.getConstructor(classOf[Project]) match {
case Some(con) =>
con.newInstance(project) // use constructor with one Project param
case None =>
cls.newInstance // just use default constructor
};
我收到以下错误:
error: type mismatch;
[scalac] found : java.lang.reflect.Constructor[_]
[scalac] required: java.lang.reflect.Constructor[_$1(in method init)] where
type _$1(in method init)
[scalac] allCatch opt cls.getConstructor(classOf[Project]) match {
[scalac] ^
[scalac] one error found
这里发生了什么,我该如何解决?
答案 0 :(得分:2)
我没有解释,但是一个更短的例子,我希望找出问题出现的地方。我认为它与例外和反思完全无关。无论这种行为是规范或错误的神秘但正确的后果,我都不知道。
val untypedList : List[_] = List("a", "b")
val typedList : List[String] = List("a", "b")
def uselessByName[A](a: => A) = a
def uselessByValue[A](a: A) = a
uselessByName(untypedList)
失败并出现与您的代码相同的错误。其他组合则没有。因此,方法与通用的逐个调用参数的组合,使用具有存在类型的泛型的参数调用。
uselessByName[List[_]](untypedList)
有效,所以我猜如果你明确地调用opt[Constructor[_]]
它也可能有效。
答案 1 :(得分:0)
我目前的解决方案是明确地转换构造函数。
cls.getConstructor(classOf[Project])
变为cls.getConstructor(classOf[Project]).asInstanceOf[Constructor[Project]]
。
我仍然想知道实际的错误,以及是否有更好的方法来解决它 - 所以我要打开它。
答案 2 :(得分:0)
类型推断方案已被可用类型混淆 - 具体来说,是cls的类型。如果我们编写通用代码:
def clser[A](cls: Class[A]) = allCatch opt cls.getConstructor(classOf[Project])
然后它完全没问题。但你可能正在做其他事情 - 我不知道是什么因为你没有提供代码 - 这导致了预期和实际类型之间的不匹配。