Java 是否可以获取类的实例<;某些通用类<;SomeType>&燃气轮机;
是否可以获取Java 是否可以获取类的实例<;某些通用类<;SomeType>&燃气轮机;,java,generics,Java,Generics,是否可以获取类的实例 例如,Class的实例,而不实例化ArrayList的实例 @SuppressWarnings(“未选中”) 公共静态T castToGeneric(对象objectToCast,T类型推断类){ 返回(T)objectToCast; } //用法 Object someObject=null/*在别处初始化*/; List listofstring=castToGeneric(someObject,newarraylist()); //我希望避免创建-new Array
类的实例
例如,Class
的实例,而不实例化ArrayList
的实例
@SuppressWarnings(“未选中”)
公共静态T castToGeneric(对象objectToCast,T类型推断类){
返回(T)objectToCast;
}
//用法
Object someObject=null/*在别处初始化*/;
List listofstring=castToGeneric(someObject,newarraylist());
//我希望避免创建-new ArrayList();
我知道这个代码很难看,我不应该这么做。但是如果我们想实例化
类
Class list=(Class)(Class)list.Class;
类型genericclass=newArrayList(){}.getClass().getGenericSuperclass();
由于Java泛型中的类型擦除,对“List”实例调用“getClass”的结果将丢失类型参数“String”,换句话说,可能无法获取“Class”。但您可以在Scala中执行此操作:
scala> List("foo", "bar").getClass
res0: java.lang.Class[_ <: List[java.lang.String]] = class scala.collection.immutable.$colon$colon
scala>List(“foo”、“bar”).getClass
res0:java.lang.Class[\p>我找到了解决您问题的方法:
@SuppressWarnings("unchecked")
public static <T> T castToGeneric(Object objectToCast) {
return (T)objectToCast;
}
// usage
Object someObject = null /* initialised elsewhere */;
Class<ArrayList<String>> listOfStrings = <Class<ArrayList<String>>>castToGeneric(someObject);
@SuppressWarnings(“未选中”)
公共静态T castToGeneric(对象objectToCast){
返回(T)objectToCast;
}
//用法
Object someObject=null/*在别处初始化*/;
类listofstring=castToGeneric(someObject);
因此,不是将类型作为参数传递,而是将其作为类型参数传递。这满足了“无实例”标准,编译并运行正常:
Class<ArrayList<String>> c =
(Class<ArrayList<String>>) Class.forName("java.util.ArrayList");
c类=
(Class)Class.forName(“java.util.ArrayList”);
这是由于类型擦除而起作用的:在运行时,ArrayList
只是ArrayList
,而且Class
只是Class
,很清楚,您获得的是Class
的一个实例,其余只是编译器的注释。@MarkoTopolnik是的-我想要一个Class@gasan你有tr吗ied编译您键入的内容?列表是一个接口,而不是一个类。例如,您只能从ArrayList获取一个类。@RobertKovačevićFalse。Java中的每个类型都有其类实例,甚至int.class
。请说明如何创建“类”参数传递到您的方法中。当T为List?OP专门要求一个解决方案而没有实例化时,您的第一行会发出未经检查的强制转换警告。我认为OP已经意识到半途而废的解决方案,并希望得到一个干净的解决方案。由于类型擦除,永远不可能有干净的解决方案。实际上没有像C这样的东西lass
;您能做的最好的事情就是向它强制转换一个类。@LouisWasserman这与类型擦除有什么关系?Class
是一个合法的类型,例如,对于这样的变量,newInstance
的返回类型是List
。唯一的问题是如何向它强制转换List.Class
文本。aClass
是一个类型的运行时表示,在运行时,没有泛型类型。任何Class
必须满足listStringClass.equals(List.Class)
。请参见,例如,但假设OP想要分配给变量Class c
@SuppressWarnings("unchecked")
public static <T> T castToGeneric(Object objectToCast) {
return (T)objectToCast;
}
// usage
Object someObject = null /* initialised elsewhere */;
Class<ArrayList<String>> listOfStrings = <Class<ArrayList<String>>>castToGeneric(someObject);
Class<ArrayList<String>> c =
(Class<ArrayList<String>>) Class.forName("java.util.ArrayList");