java - 'Class<?>' 和 'Object' 作为方法参数之间的区别

标签 java

假设我想要一个方法来获取应用程序中任何类型的对象,以验证它具有的所有字段(每个对象具有不同类型的不同字段)并将其包装到消息中。因此方法输入参数将是任何对象的实例

现在我的问题是: 将此输入参数作为 Object 有什么区别或Class<?>

据我所知?表示“任何类型或类”,“Object”是 java 中的父类(super class)型。

如果有人能解释一下在哪些情况下最好使用它,我将不胜感激:

public validateAndConvertAnyObject(Object obj) {
    // compute and return a message
}

什么时候使用它更好?

public validateAndConvertAnyObject(Class<?> obj) {
    // compute and return a message
}

最佳答案

首先,您没有在方法中指定返回类型。
它无效。

其次,这两个参数完全不同。

public validateAndConvertAnyObject(Object obj)  

可以接受任何对象。

同时public validateAndConvertAnyObject(Class<?> obj)

可以接受任何类(class)。

相当于

public validateAndConvertAnyObject(Object obj)  

通用的将是:

public <T> void validateAndConvertAnyObject(T obj){

编译和类型删除后,它们提供相同的编译类。
所以在这个例子中,使用 Object越明确就越有意义。

要使用反射将实例转换为另一个类,通常需要传递目标类:

public <T> T validateAndConvertAnyObject(Object obj, Class<T> targetClass){
    ...//processing on obj

}

你可以使用它:

MyObject myObject = ...;
MyOtherClass myOtherClass = validateAndConvertAnyObject(myObject, MyOtherClass.class);

关于java - 'Class<?>' 和 'Object' 作为方法参数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46744297/

相关文章:

java - 从用户输入获取命令时出现问题

Java 比较器 - 函数访问

java - 将 String 设置为不为 null 的值

java - 如何保证一段代码在多线程环境下只执行一次?

java - 内存直接映射到字符串

java - JAX Web 服务无法在 CodenameOne 项目中工作

java - jsp 中未显示整个字符串内容

java - 扩展 StackView 或 AdapterViewAnimator 似乎是不可能的

java - 当精细头记录时将文件分割成 block (java 8)

java - 使用聚合代替嵌套的 for 循环