繁体   English   中英

类之间的区别 <?> &#39;和&#39;Object&#39;作为方法的参数

[英]difference between 'Class<?>' and 'Object' as argument of method

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

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

据我所知? 表示'any type or class'和'Object'是java中的超类型。

我很高兴有人可以向我解释在哪种情况下最好使用此方法:

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)

可以接受任何课程。

相当于

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

可以使用任何对象作为参数来调用第一个方法,例如"foo"42Integer.class 第二个将仅接受类对象,例如"foo".getClass()String.class

Class<?>Object什么区别

Object

这将实例作为参数

Class<?>

这需要一个类作为参数

Object可以等于String ,并且对于类似的结果,您可以让Class<?>等于java.lang.String

混乱

从技术上讲,您可以将Class<?>一个实例作为Object传递,这会增加混乱,这是使用Class<?>一个很好的理由,因为它可以防止实例和其类混淆。

Object实际上代表创建的对象实例 ,例如:

String text = "Hello World!";
Object textAsObj = (Object) text;

尽管Class仅表示对象的 ,但与该类的实际实例没有任何关系

Class<?> textClass = Class.forName("java.util.String");

因此,如果要访问实例的特定值,则可能应该使用Object变量。 您可以随时使用getClass方法从Object检索类:

String text = "Hello World!";
Class<String> textClass = text.getClass();

这是一个示例,您如何使用它来访问给定Object的字段:

Person person = new Person("John Doe");
Class<Person> personClass = person.getClass();

Field nameField = personClass.getDeclaredField("name");
String name = (String) nameField.get(person);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM