【问题标题】:Pass any Class as a parameter for a method将任何类作为方法的参数传递
【发布时间】:2019-01-24 10:35:32
【问题描述】:

这可能以前被问过,我见过一些类似的/类似的,但不太明白。

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

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

【问题讨论】:

  • 任何类对象或任何实例?前者使用Class&lt;?&gt;,后者使用Object
  • 不,它必须是类本身 - 或稍后使用的类引用(用于映射)。这可能吗?
  • 这可能对你有帮助。stackoverflow.com/questions/4872978/…
  • 在这种情况下,您可以使用Class&lt;?&gt; 作为参数类型,然后将其称为:myMethod("Hello", ClassA.class)
  • 是的,这是个问题吗?

标签: java generics


【解决方案1】:

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】:

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

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

    【讨论】:

      【解决方案3】:

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

      ClassA test = doSomething("String One", ClassA.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);
      }
      

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

      【讨论】:

      • 非常感谢您的解释和帮助!这几乎是我设法找到的最连贯的答案:)
      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2015-12-26
      相关资源
      最近更新 更多