Class 如何从隐式类标记[T]获取类[T]?

Class 如何从隐式类标记[T]获取类[T]?,class,scala,reflection,scala-2.10,Class,Scala,Reflection,Scala 2.10,我想要一个像这样的方法 def retrieve[T](value: Option[T])(implicit ct: ClassTag[T]): T; 在这个方法中,我需要调用一个Java方法(我无法控制)来创建需要Class[T]的T实例: 公共T构造(clazz:Class/*其他参数*/){…} 如何从ClassTag[T]获取Class[T]?首先,我想我可以使用ClassTag中的runtimeClass,但它的类型是Class[\u],而不是Class[T]。或者编译器是否可以自

我想要一个像这样的方法

def retrieve[T](value: Option[T])(implicit ct: ClassTag[T]): T;
在这个方法中,我需要调用一个Java方法(我无法控制)来创建需要
Class[T]
T
实例:

公共T构造(clazz:Class/*其他参数*/){…} 如何从
ClassTag[T]
获取
Class[T]
?首先,我想我可以使用
ClassTag
中的
runtimeClass
,但它的类型是
Class[\u]
,而不是
Class[T]
。或者编译器是否可以自动提供任何其他隐式值,从中我可以获得
Class[T]

关于
getClass
以及奥德斯基推测的:

你也可以用石膏

其中
getClass
是固定的<代码>5。getClass也可以强制转换:

/** Return the class object representing an unboxed value type,
 *  e.g. classOf[int], not classOf[java.lang.Integer].  The compiler
 *  rewrites expressions like 5.getClass to come here.
 */
def anyValClass[T <: AnyVal : ClassTag](value: T): jClass[T] =
  classTag[T].runtimeClass.asInstanceOf[jClass[T]]
这似乎不公平

正如2008年的那个邮件线程所总结的,您希望在Scala中使用更少的强制转换

顺便说一句,不是我不相信代码注释,而是:

scala> 5.getClass
res38: Class[Int] = int

scala> :javap -
  Size 1285 bytes
  MD5 checksum a30a28543087238b563fb1983d7d139b
  Compiled from "<console>"

在使用java反射时,您不应该害怕强制转换。只要做一个[Class[T]]的实例就行了。这是一个很好的研究,但不是一个好的答案。链接,引号,源代码,反汇编。。。那么如何从
ClassTag[T]
中获取
Class[T]
?(我的意思是我能弄明白,但我认为答案的第一要务应该是回答这个问题,然后提供上下文。)@DanielDarabos它说使用cast,然后展示了一个使用cast从类标记到类的示例。这个答案远远超出了职责范围。该专栏没有发表意见。“使用演员阵容”是一个论坛上的一个猜测。“示例”是来自Scala运行时内部的代码片段(
ScalaRunTime.Scala
),插入时没有说“这就是您的工作方式”。它返回一个
jClass[T]
,这是文件中
Class[T]
的本地别名,但答案的读者不知道这一点。无论如何,我不想批评答案,我只是想给出反馈。这是一个非常有见地的回答。@DanielDarabos thx,以供反馈。可能一些不会阅读示例的人不应该尝试这样做。我愿意把目标放低一些,回答一些新手问题。还有一种观点认为,SO Q&a在特定时间解决OP的问题,并不总是规范的或常见问题。绿色检查的定义是它解决了OP的问题。Downvote的意思是“没用”。
scala> 5.getClass
res38: Class[Int] = int

scala> :javap -
  Size 1285 bytes
  MD5 checksum a30a28543087238b563fb1983d7d139b
  Compiled from "<console>"
 9: getstatic     #27                 // Field scala/runtime/ScalaRunTime$.MODULE$:Lscala/runtime/ScalaRunTime$;
12: iconst_5      
13: invokestatic  #33                 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer;
16: getstatic     #38                 // Field scala/reflect/ClassTag$.MODULE$:Lscala/reflect/ClassTag$;
19: invokevirtual #42                 // Method scala/reflect/ClassTag$.Int:()Lscala/reflect/ClassTag;
22: invokevirtual #46                 // Method scala/runtime/ScalaRunTime$.anyValClass:(Ljava/lang/Object;Lscala/reflect/ClassTag;)Ljava/lang/Class;
25: putfield      #18                 // Field res38:Ljava/lang/Class;
28: return