Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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 是否可以获取类的实例<;某些通用类<;SomeType>&燃气轮机;_Java_Generics - Fatal编程技术网

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
文本。a
Class
是一个类型的运行时表示,在运行时,没有泛型类型。任何
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");