猿问

将任何类作为方法的参数传递

这可能以前被问过,我已经看到了一些类似的/沿线,但不太明白。


在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);

希望这有助于理解问题......以及我对解决方案的理解!


白衣染霜花
浏览 131回答 3
3回答

杨__羊羊

1)没有类型信息:public static Class<?> myMethod(String text, Class<?> clazz) {&nbsp; &nbsp; // body&nbsp; &nbsp; return clazz;}客户端代码:public static void main(String[] args) {&nbsp; &nbsp; Class<?> clss = myMethod("Example", String.class);}2)带有类型信息:public static <T> Class<T> myMethod(String x, Class<T> clazz) {&nbsp; &nbsp; // body&nbsp; &nbsp; return clazz;}客户端代码:public static void main(String[] args) {&nbsp; &nbsp; Class<String> clsStr = myMethod("Example", String.class);&nbsp; &nbsp; Class<?> clsAny = myMethod("Example", String.class);}3)原始类型(可以使用但不推荐):public static Class myMethod(String x, Class clazz) {&nbsp; &nbsp; // body&nbsp; &nbsp; return clazz;}客户端代码:public static void main(String[] args) {&nbsp; &nbsp; Class<String> clsStr = myMethod("Example", String.class); // warning for Unchecked Assignment&nbsp;&nbsp; &nbsp; Class<?> clsAny = myMethod("Example", String.class);&nbsp; &nbsp; Class clsRaw = myMethod("Example", String.class);}4) 在类级别定义类型信息:public class Main<T> {&nbsp;&nbsp; &nbsp; // cannot be static&nbsp; &nbsp; public Class<T> myMethod(String x, Class<T> clazz) {&nbsp; &nbsp; &nbsp; &nbsp; // body&nbsp; &nbsp; &nbsp; &nbsp; return clazz;&nbsp; &nbsp; }}客户端代码:public static void main(String[] args) {&nbsp; &nbsp; Main<String> m = new Main<>();&nbsp; &nbsp; Class<String> cls = m.myMethod("x", String.class);}

12345678_0001

我假设您需要接受某种类型的类T作为参数并返回该类。在这种情况下,您的方法签名将是这样的:public <T> Class<T> myMethod(String whatever, Class<T> clazz){&nbsp; &nbsp; // put the rest of your code here}

HUX布斯

在您的最新编辑中,您的使用示例如下:ClassA&nbsp;test&nbsp;=&nbsp;doSomething("String&nbsp;One",&nbsp;ClassA.class);该问题显示了类名、类对象和类实例之间的混淆。所以只是为了澄清,使用上面的例子:一个类名————ClassA用来声明一个变量。一个 Class 实例 –&nbsp;ClassA.class– 是一个单例对象,它包含有关类的信息,并且可以作为参数传递给方法。一个类的实例test——是一个对象。它通常使用new关键字创建。您不能直接在声明中使用Class对象,例如。ClassA.class相反,您必须调用该类的newInstance()方法Class。仅当您的类具有无参数构造函数时才能使用该方法。要使用构造函数参数创建实例,请使用以下内容:public <T> T doSomething(String jsonString, Class<T> clazz) throws ReflectiveOperationException {&nbsp; &nbsp; Constructor<T> constructor = clazz.getConstructor(String.class);&nbsp; &nbsp; return constructor.newInstance(jsonString);}上面的方法使用带有 String(传入的字符串)的构造函数创建所需类的实例。根据您的要求更改其主体以创建实例。
随时随地看视频慕课网APP

相关分类

Java
我要回答