使用allCatch opt时输入不匹配

时间:2011-06-16 18:07:14

标签: exception scala

为了避免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

这里发生了什么,我该如何解决?

3 个答案:

答案 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])

然后它完全没问题。但你可能正在做其他事情 - 我不知道是什么因为你没有提供代码 - 这导致了预期和实际类型之间的不匹配。