这可能以前有人问过,我也看到过一些类似的问题,但不太理解。
在Java中,如何使方法接受任何类作为参数?
例如,
public (AnyClass) myMethod(String whatever, (AnyClass) thisClass){
}
像一样使用
myMethod("Hello", ClassA);
myMethod("Hello", ClassB);
谢谢你的帮助!
编辑:
要求提供用法示例;我正在做的是将一个JSON字符串映射到一个POJO,但试图将整个内容抽象出来,以便重用。所以——我需要能够通过任何类和JSON字符串(或HttpConn),然后构建,然后使用Jackson构建POJO并返回对象,无论是什么类型。
(我想做什么的想法):
public Class<?> doSomething(String jsonString, Class<?> clazz){
clazz newInstance = mapper.readValue(jsonString, clazz);
return clazz;
}
称为:
ClassA test = doSomething("String One", ClassA.class);
ClassB testTwo = doSomething("Different format string", ClassB.class);
希望这有助于理解问题。。。以及我对解决方案的理解!
1)没有类型信息:
public static Class<?> myMethod(String text, Class<?> clazz) {
// body
return clazz;
}
客户代码:
public static void main(String[] args) {
Class<?> clss = myMethod("Example", String.class);
}
2) 带类型信息:
public static <T> Class<T> myMethod(String x, Class<T> clazz) {
// body
return clazz;
}
客户代码:
public static void main(String[] args) {
Class<String> clsStr = myMethod("Example", String.class);
Class<?> clsAny = myMethod("Example", String.class);
}
3) 原始类型(有效,但不推荐):
public static Class myMethod(String x, Class clazz) {
// body
return clazz;
}
客户代码:
public static void main(String[] args) {
Class<String> clsStr = myMethod("Example", String.class); // warning for Unchecked Assignment
Class<?> clsAny = myMethod("Example", String.class);
Class clsRaw = myMethod("Example", String.class);
}
4) 具有在类级别定义的类型信息:
public class Main<T> {
// cannot be static
public Class<T> myMethod(String x, Class<T> clazz) {
// body
return clazz;
}
}
客户代码:
public static void main(String[] args) {
Main<String> m = new Main<>();
Class<String> cls = m.myMethod("x", String.class);
}
我假设您需要接受某种类型的T
类作为参数,并返回该类。在这种情况下,您的方法签名将是这样的:
public <T> Class<T> myMethod(String whatever, Class<T> clazz){
// put the rest of your code here
}
在您最近的编辑中,您的使用示例如下:
ClassA test = doSomething("String One", ClassA.class);
这个问题显示了类名、class对象和类实例之间的混淆。为了澄清,使用上面的例子:
类名
ClassA
用于声明变量。类实例
ClassA.class
是一个单例对象,它包含有关类的信息,可以作为参数传递给方法。类的实例
test
是一个对象。它通常使用new
关键字创建。
不能在声明中直接使用Class
对象,如ClassA.class
。相反,您必须调用Class
类的newInstance()
方法。只有当您的类具有无参数构造函数时,才能使用该方法。要创建一个带有构造函数参数的实例,请使用以下内容:
public <T> T doSomething(String jsonString, Class<T> clazz) throws ReflectiveOperationException {
Constructor<T> constructor = clazz.getConstructor(String.class);
return constructor.newInstance(jsonString);
}
上面的方法使用构造函数创建所需类的实例,该构造函数接受String(传入的字符串)。根据您的要求更改其主体以创建实例。