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

时间:2019-01-24 10:35:33

标签: java generics

这可能是以前问过的,我已经看过一些类似/沿线的内容,但不太了解。

在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 个答案:

答案 0 :(得分:3)

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

public <T> Class<T> myMethod(String whatever, Class<T> clazz){
    // put the rest of your code here
}

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

问题显示了类名,Class对象和类实例之间的混淆。因此,使用上面的示例进行澄清:

  • 类名– ClassA –用于声明变量。

  • 类实例– 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(传入的字符串)的构造函数创建所需类的实例。更改其主体以根据您的要求创建实例。