为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣染霜花 2022-05-21 20:52:14
这可能以前被问过,我已经看到了一些类似的/沿线,但不太明白。在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);希望这有助于理解问题......以及我对解决方案的理解!
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

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

}


查看完整回答
反对 回复 2022-05-21
?
12345678_0001

TA贡献1802条经验 获得超5个赞

我假设您需要接受某种类型的类T作为参数并返回该类。在这种情况下,您的方法签名将是这样的:


public <T> Class<T> myMethod(String whatever, Class<T> clazz){

    // put the rest of your code here

}


查看完整回答
反对 回复 2022-05-21
?
HUX布斯

TA贡献1876条经验 获得超6个赞

在您的最新编辑中,您的使用示例如下:

ClassA test = doSomething("String One", ClassA.class);

该问题显示了类名、类对象和类实例之间的混淆。所以只是为了澄清,使用上面的例子:

  • 一个类名————ClassA用来声明一个变量。

  • 一个 Class 实例 – ClassA.class– 是一个单例对象,它包含有关类的信息,并且可以作为参数传递给方法。

  • 一个类的实例test——是一个对象。它通常使用new关键字创建。

您不能直接在声明中使用Class对象,例如。ClassA.class相反,您必须调用该类的newInstance()方法Class。仅当您的类具有无参数构造函数时才能使用该方法。要使用构造函数参数创建实例,请使用以下内容:

public <T> T doSomething(String jsonString, Class<T> clazz) throws ReflectiveOperationException {

    Constructor<T> constructor = clazz.getConstructor(String.class);

    return constructor.newInstance(jsonString);

}

上面的方法使用带有 String(传入的字符串)的构造函数创建所需类的实例。根据您的要求更改其主体以创建实例。


查看完整回答
反对 回复 2022-05-21
  • 3 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信