Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递给Java通用容器的Scala通用参数类型 问题:如何将泛型类型从Scala传递到Java,以便JavaContainer中的下一个代码不会像这样失败: 我是某个类的实例 线程“main”java.lang.ClassCastException中出现异常:无法将java.lang.Class转换为java.lang.reflect.ParameterizedType 位于main.java.JavaContainer.print(JavaContainer.java:19) 在main.scala.main$.print处(main.scala:13) 在main.scala.main$.main(main.scala:17) at main.scala.main.main(main.scala)_Java_Scala_Generics_Reflection - Fatal编程技术网

传递给Java通用容器的Scala通用参数类型 问题:如何将泛型类型从Scala传递到Java,以便JavaContainer中的下一个代码不会像这样失败: 我是某个类的实例 线程“main”java.lang.ClassCastException中出现异常:无法将java.lang.Class转换为java.lang.reflect.ParameterizedType 位于main.java.JavaContainer.print(JavaContainer.java:19) 在main.scala.main$.print处(main.scala:13) 在main.scala.main$.main(main.scala:17) at main.scala.main.main(main.scala)

传递给Java通用容器的Scala通用参数类型 问题:如何将泛型类型从Scala传递到Java,以便JavaContainer中的下一个代码不会像这样失败: 我是某个类的实例 线程“main”java.lang.ClassCastException中出现异常:无法将java.lang.Class转换为java.lang.reflect.ParameterizedType 位于main.java.JavaContainer.print(JavaContainer.java:19) 在main.scala.main$.print处(main.scala:13) 在main.scala.main$.main(main.scala:17) at main.scala.main.main(main.scala),java,scala,generics,reflection,Java,Scala,Generics,Reflection,对于这个问题,我有一个给定的(并且不可能从外部Jar更改Java类),我们将其称为:JavaContainer import java.lang.reflect.ParameterizedType; public/*您可以删除final标记,问题仍然存在*/final类JavaContainer{ 私人课堂; 公共JavaContainer(clazz类){ this.clazz=clazz; } 公开作废印刷品(){ /*这个有效*/ 试一试{ T unknown=clazz.newInsta

对于这个问题,我有一个给定的(并且不可能从外部Jar更改Java类),我们将其称为:JavaContainer

import java.lang.reflect.ParameterizedType;
public/*您可以删除final标记,问题仍然存在*/final类JavaContainer{
私人课堂;
公共JavaContainer(clazz类){
this.clazz=clazz;
}
公开作废印刷品(){
/*这个有效*/
试一试{
T unknown=clazz.newInstance();
}捕获(实例化异常|非法访问异常e){
e、 printStackTrace();
}
/*这个不是*/
类persistentClass=(类)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(persistentClass.getName());
}
}
我还有一个Java类,它将用作类型参数:SomeClass

公共类SomeClass{
公共类(){
System.out.println(“我是某个类的实例”);
}
}
现在我想创建一个名为ScalaContainer的Scala

import main.java.{JavaContainer,SomeClass}
类ScalaContainer[T]()(隐式m:Manifest[T]){
val clazz=m.runtimeClass.asInstanceOf[Class[T]]
val-javaContainer:javaContainer[T]=新的javaContainer[T](clazz)
}
main对象中也有我们的主要方法

objectmain{
def打印{
val main=新的ScalaContainer[SomeClass]()
main.javaContainer.print()
}
def main(参数:数组[字符串]){
打印
}
}

Hrmmm。。我正试图描绘你的代码和它在做什么。它提醒我使用Hibernate和泛型DAO,我已经做了很多,所以我想说,你应该看看哪个会以你设置它的方式打印某个类。这里还有打字工具


如果我正确理解了您的问题,我认为这应该让您走上正确的道路。

您的猜测是正确的,这与DAO有关,尽管它不是hibernate,而是。有一个类有这种行为,我简化了这个问题。啊,我明白了。然后我肯定会查看TypeToken。您可以直接使用它,也可以查看它是如何实现的。这是我在制作DAO时能够解决类型擦除问题的方法之一。重点是我不想更改Morphia代码,我正在从Scala类传递泛型参数,我可以更改它。即使我用Scala来包装它,我认为这种情况无论如何都会发生,因为代码失败是我力所能及的。反正我也要试试。啊,我现在明白了。我不知道java部件不在您的控制之下。现在这正困扰着我。。。我无法让它工作:(
JavaContainer
似乎天生就坏了。调用
getClass().getGenericSuperclass()
的行似乎假设
t
将由扩展类解决(例如,Guava的工作方式)但是
JavaContainer
被标记为
final
,所以这是不可能的。没有最终标记就复制,所以不是这样。我想你不明白我的意思。需要有一个扩展
JavaContainer
的类才能将
t
重新定义为
SomeConcreteType
。哇r编写的
JavaContainer
是cargo cult编程。问题是,当我在“Java世界”时,我可以传递我想要的任何东西,但当类型来自“Scala世界”或我缺少某些东西时,情况并非如此。