Java 泛型的 valueOf 方法 class
Java valueOf method for generic class
给定一个泛型 class Foo<T>
,我想创建一个静态方法 valueOf(String s)
。 String s
应该包含 class 的名称(例如 "java.lang.Integer"
)。调用 valueOf("java.lang.Integer")
应该 return 一个新对象 Foo<Integer>
.
在我的 class 中(见下面的代码),我想存储 Class<T>
,它作为参数传递给构造函数 Foo(Class<T> clazz)
。但是在 valueOf
方法中,我不确定要将什么参数传递给我喜欢的对象的构造函数 Foo(Class<T> clazz)
return.
由于我对 java 反射比较陌生,所以我不确定如何将此逻辑应用到我的通用 class 中。我了解到 Class.forName(String)
方法 return 是一个对象 Class<?>
,但我不知道如何找出通配符的类型?代表(如果可以使用反射),或者我在这个方向上错了吗?
public class Foo<T> {
private Class<T> clazz;
public Foo(Class<T> clazz) {
this.clazz = clazz;
}
public static <E> Foo<E> valueOf(String s) throws ClassNotFoundException {
Class<?> clazz = Class.forName(s);
// here i am stuck. I would like to return new Foo<E>,
// but what is E, E's class and therefore the parameter for the constructor?
}
}
你不能用泛型来做到这一点。泛型只是编译器静态地为您进行的强制转换。所以,如果你不能用你在代码中编写的强制转换来做到这一点(也就是说,你不能对不同的字符串进行不同的强制转换),你也不能用泛型来做到这一点。
您需要某种键而不是 String
,它传达类型 T
/E
。可以直接传入Class<E>
:
public static <E> Foo<E> valueOf(Class<E> clazz) throws ClassNotFoundException {
// ...
}
给定一个泛型 class Foo<T>
,我想创建一个静态方法 valueOf(String s)
。 String s
应该包含 class 的名称(例如 "java.lang.Integer"
)。调用 valueOf("java.lang.Integer")
应该 return 一个新对象 Foo<Integer>
.
在我的 class 中(见下面的代码),我想存储 Class<T>
,它作为参数传递给构造函数 Foo(Class<T> clazz)
。但是在 valueOf
方法中,我不确定要将什么参数传递给我喜欢的对象的构造函数 Foo(Class<T> clazz)
return.
由于我对 java 反射比较陌生,所以我不确定如何将此逻辑应用到我的通用 class 中。我了解到 Class.forName(String)
方法 return 是一个对象 Class<?>
,但我不知道如何找出通配符的类型?代表(如果可以使用反射),或者我在这个方向上错了吗?
public class Foo<T> {
private Class<T> clazz;
public Foo(Class<T> clazz) {
this.clazz = clazz;
}
public static <E> Foo<E> valueOf(String s) throws ClassNotFoundException {
Class<?> clazz = Class.forName(s);
// here i am stuck. I would like to return new Foo<E>,
// but what is E, E's class and therefore the parameter for the constructor?
}
}
你不能用泛型来做到这一点。泛型只是编译器静态地为您进行的强制转换。所以,如果你不能用你在代码中编写的强制转换来做到这一点(也就是说,你不能对不同的字符串进行不同的强制转换),你也不能用泛型来做到这一点。
您需要某种键而不是 String
,它传达类型 T
/E
。可以直接传入Class<E>
:
public static <E> Foo<E> valueOf(Class<E> clazz) throws ClassNotFoundException {
// ...
}