&#39; Class <! - ? - >&#39;之间的区别和&#39;对象&#39;作为方法的论据

时间:2017-10-14 11:59:54

标签: java

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

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

据我所知?表示任何类型或类别&#39;和&#39;对象&#39;是java中的超类型。

我很感激,如果有人能够解释我在哪些情况下更好地使用它:

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

什么时候使用它更好?

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

4 个答案:

答案 0 :(得分:1)

首先,您不要在方法中指定返回类型 这是无效的。

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

public validateAndConvertAnyObject(Object obj)  

可以接受任何对象。

public validateAndConvertAnyObject(Class<?> obj)

可以接受任何课程。

相当于

public validateAndConvertAnyObject(Object obj)  

with generic将是:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Class<?>Object

之间有什么区别?

Object

这将实例作为参数

Class<?>

这需要一个类作为参数

实施例

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

混乱

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

答案 3 :(得分:0)

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

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

虽然Class仅代表对象的,但它与此类的实际实例无连接

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

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

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