gpt4 book ai didi

java - 反射中的泛型

转载 作者:行者123 更新时间:2023-12-01 11:17:41 26 4
gpt4 key购买 nike

我正在为 Box 类创建一个具有类型参数的 Class 对象。在我获取 Class 对象的地方,它会抛出一个警告,表明类类型是原始的 - (Class objCB = b.getClass())。

我的疑问是,在为具有类型参数的任何类创建 Class 对象时,为什么应该使用泛型。以及如何解决该警告。下面是我的代码

//Box Class
public class Box <T extends Comparable<T>>{

public T objA;
public T objB;

public void set(T t1, T t2)
{
this.objA = t1;
this.objB = t2;
}

public int compare()
{
return this.objA.compareTo(this.objB);
}

}

// Refelection class
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;

public class Test6 {

public static void main(String[] args) throws ClassNotFoundException {

//using getClass
Box <Integer> b = new Box <Integer>();
Class objCB = b.getClass(); //warning thrown here
Method[] methods = objCB.getMethods();
for (Method m : methods)
{
System.out.println(m.getName());
}

System.out.println("==================");

//using class
Class objC2 = Box.class; //warning thrown here
Field[] fields = objC2.getFields();
for (Field f : fields)
{
System.out.println(f.getName());
}

System.out.println("==================");
//using forName()
Class objC3 = Class.forName("Box"); //warning thrown here
Type[] types = objC3.getTypeParameters();
for (Type t : types)
{
System.out.println(t.toString());
}

System.out.println("==================");
//using Type()
Class objI = Integer.TYPE; //warning thrown here
System.out.println(objI.getName());
}
}

最佳答案

Class类有一个泛型参数,通常应该指向该类代表的类型。它用于使用 newInstance() 安全地实例化对象。或getConstructor(...).newInstance()或者调用其他一些方法,例如 cast()getEnumConstants() 。例如,您可以在不进行类型转换的情况下使用:

Integer i = Integer.class.getConstructor(int.class).newInstance(0);

在许多情况下,很难保留精确的类型参数。例如,Object.getClass()方法的返回类型 Class<?> 。另一方面,当您不打算实例化该类时,具有 Class<?>很好。所以替换你的原始 ClassClass<?> .

如果您以后想以安全的方式将其更改为某个特定的类,您可以使用 asSubclass :

Class<?> someClass = i.getClass();
// type check is done here: CCE will be thrown if someClass is not Integer.class
Class<? extends Integer> c = someClass.asSubclass(Integer.class);
// No type check is necessary here.
Integer ii = c.getConstructor(int.class).newInstance(0);

无论如何,使用原始类型都是不好的,并且可能会导致严重的问题,这就是发出警告的原因。避免原始类型。

关于java - 反射中的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31608560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com