2

これは、あなたが行くときの 1 つです。つまり、コンパイルされないということですか?

これは修辞的な質問ではありません。最短または最も慣用的な修正は何ですか? ボーナスポイントの場合、なぜ必要なのですか?

scala> import scala.util.Try
import scala.util.Try

scala> Try { getClass.getClassLoader loadClass "scala.util.Try" }

これがゲームを放棄しないことを願っていますが、メッセージは次のとおりです。

<console>:9: error: type mismatch;
 found   : Class[_]
 required: Class[?0(in value res0)] where type ?0(in value res0)
Note: Any >: ?0, but Java-defined class Class is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: ?0`. (SLS 3.2.10)
              Try { getClass.getClassLoader loadClass "scala.util.Try" }

「調査する」とは、基礎研究のようなものですか、それとも文献で既に利用可能な技術を適用するだけですか?

私はまだ、「読者の課題として残しておきます」というエラー メッセージが表示されるのを待っています。

アップデート:

これは Scala 2.10 の演習です。

いつものように、待っている人にはすべての良いことがやってくる:

apm@mara:~/tmp$ skala
Welcome to Scala version 2.11.0-20130622-103744-990c2b024a (OpenJDK 64-Bit Server VM, Java 1.7.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.language.existentials
import scala.language.existentials

scala> import scala.util.Try
import scala.util.Try

scala> Try { getClass.getClassLoader loadClass "scala.util.Try" }
res0: scala.util.Try[Class[?0]] forSome { type ?0 } = Success(class scala.util.Try)
4

2 に答える 2

1

トライが原因です。私にとってscala 2.10.0:

scala> import scala.util.Try
scala> val typeName = "scala.util.Try"    

エラー:

scala> Try(Class.forName(typeName))
<console>:10: error: type mismatch;
 found   : Class[_]
 required: Class[?0(in value res1)] where type ?0(in value res1)
Note: Any >: ?0, but Java-defined class Class is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: ?0`. (SLS 3.2.10)
              Try(Class.forName(typeName))
                               ^

エラーなし:

scala> Try[Class[_]](Class.forName(typeName))
res2: scala.util.Try[Class[_]] = Success(class scala.util.Try)

catchingにも同じ問題があります:

scala> import scala.util.control.Exception._

scala> catching(classOf[Throwable]) opt Class.forName(typeName)
<console>:13: error: type mismatch;
 found   : Class[_]
 required: Class[?0(in value res4)] where type ?0(in value res4)
Note: Any >: ?0, but Java-defined class Class is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: ?0`. (SLS 3.2.10)
              catching(classOf[Throwable]) opt Class.forName(typeName)
于 2013-02-20T23:47:55.980 に答える
1

これは確かに重複した質問でなければなりません。多分誰かがそれを指摘することができるか、またはここで自然に起こることを型推論がどのように行っていないかを正確に指摘することができます.

誰かが答えを残しました (消えてしまったようです?) 。ひょっとしたら、マクガイバーの助けも必要かもしれません。

フォーラムに行く途中で試したいくつかのバリアントを次に示します。

package classy
import scala.util._

class Foo

object Test {

  /* DNC
  def loadTry(n: String, loader: ClassLoader) = Try { loader loadClass n }
  def loadTry(n: String, loader: ClassLoader): Try[Class[_]] = Try { loader loadClass n }
  */

  def main(args: Array[String]) {
    val cl = getClass.getClassLoader
    println(loadTry("classy.Foo", cl))
    println(loadTry("classy.Bar", cl))

    println(cl loadClass "classy.Foo")
    println(loadOpt("classy.Foo", cl))
    println(loadTryAgain("classy.Foo", cl))
    println(loadTryYetAgain("classy.Foo", cl))
  }

  def loadOpt(n: String, loader: ClassLoader): Option[Class[_]] =
    try Some(loader loadClass n) catch {
      case _: Exception => None
    }
  def loadTryAgain(n: String, loader: ClassLoader): Try[Class[_]] = {
    val res: Option[Class[_]] = try Some(loader loadClass n) catch {
      case _: Exception => None
    }
    res match {
      case None    =>
        Failure(new RuntimeException(s"Warning: class not found: ${n})"))
      case Some(x) =>
        Success(x)
    }
  }
  def loadTryYetAgain(n: String, loader: ClassLoader): Try[Class[_]] = {
    val res = try loader loadClass n catch {
      case _: Exception => null
    }
    res match {
      case null =>
        Failure(new RuntimeException(s"Warning: class not found: ${n})"))
      case x    =>
        Success(x)
    }
  }
  def loadTry(n: String, loader: ClassLoader) =
    Try[Class[_]] {
      loader loadClass n
    } recoverWith {
      case e: Exception =>
        Failure(new RuntimeException(s"Warning: class not found: ${n} (${e.getMessage})"))
    }
}
于 2012-12-14T01:20:53.353 に答える