假设我想要一个方法,在我的应用程序中获取任何类型的对象,以验证它具有的所有字段(每个对象具有不同类型的不同字段)并将其包装到消息中。所以方法输入参数将是任何对象的实例
现在我的问题是:
将此输入参数作为Object
或Class<?>
之间的区别是什么?
据我所知?
表示任何类型或类别&#39;和&#39;对象&#39;是java中的超类型。
我很感激,如果有人能够解释我在哪些情况下更好地使用它:
public validateAndConvertAnyObject(Object obj) {
// compute and return a message
}
什么时候使用它更好?
public validateAndConvertAnyObject(Class<?> obj) {
// compute and return a message
}
答案 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"
,42
或Integer.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);