我对Java很新。这可能是一个愚蠢的问题 - 但我无法在任何地方找到答案。如果你想声明一个接收未知对象并对其做某事的方法(例如复制它),那么会有什么区别:
<T> T func(Class<T> cls){
//do something
}
Object func(Object o){
//do something
}
他们可比吗?你有什么能用上述方法而不是其他方法吗? Class<?>
在哪里适合?
答案 0 :(得分:4)
代码的不同之处在于,前func
收到Class<T>
(可以是Class<?>
),这意味着该方法只会收到Class
类型。后者接收任何对象,无论它是一个类还是另一种对象。
来自Class
javadoc:
类Class的实例表示正在运行的Java应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组也属于一个类,它反映为一个Class对象,由具有相同元素类型和维数的所有数组共享。
请注意,Class
是您班级的元数据。
如果您的代码是这样的:
<T> T func(T o){
//do something
}
Object func(Object o){
//do something
}
主要区别在于返回类型:前一个返回类型应该与参数的类型相同,而后一个是泛型Object
。例如:
Object func(Object o){
//do something
return o.toString(); //compiles and works
}
<T> T func(T o){
//do something
return o.toString(); //does not compile
}
答案 1 :(得分:1)
Class
是一种非常特殊的对象类型。 Class<T>
不是任何类型对象的替代品,而是类描述符。在Java中,一切都是对象,类也是对象,所以有这种类型 - Class
- 它抽象了“类”对象类。
以下是一个例子:
如果你有这个:
Class<Object> obj = Object.class;
func(obj);
,这并不意味着您可以在func
方法中访问Object
个实例;您将可以访问Class<Object>
实例,该实例是Object
类的描述符。
因此,要回答您的问题,您应该使用Object
来宣布您的目的。
答案 2 :(得分:1)
Class
和Object
是Java中的两个不同的东西。如果你想拍摄任何类型的物体,你不关心它的类型,通常会看到以下情况。
Object func(Object o){
//do something
}
使用Object
vs Class
声明函数更为常见,因为传递类而不是对象的步骤更多。
答案 3 :(得分:0)
让我们看看你的功能
<T> T func(Class<T> cls){
//do something
}
这个将class作为参数,并返回类的实例,
想象方法作为黑盒子做一些神奇的东西
你输入String.class
,你将获得&#34; hello world&#34;
第二个
Object func(Object o){
//do something
}
将对象作为参数并返回对象,因此理论上,您可以插入类并返回实例,但您也可以输入日期和接收的字符串
答案 4 :(得分:0)
第一个函数接受java.lang.Class(它也是Object类的一个实例,因为Class扩展了它。您可以在javadoc中找到有关Class类的更多信息:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html)。 因此,第一种方法可以使用Class的实例执行某些操作,并且它不接受所有对象(请注意大写字母,它是类的名称)。
第二种方法接受所有对象(因为每个对象都扩展了java.lang.Object)。 (对象&#39; s javadoc:http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html)
因此,如果你想创建一个方法,可以“接收一个未知的对象并用它做一些事情”#34;你必须使用第二种方法。您还应该知道,通常您不需要接受任何对象或未知对象的方法,如果您可以找到其他解决方案,则不应创建此类方法(因为它会导致代码难以阅读)。
当您想要对类的定义执行某些操作(检索字段,方法,构造函数等列表)时,接受Class作为参数的方法很有用。此网页说明了如何使用Class类:http://docs.oracle.com/javase/tutorial/reflect/index.html
此外,如果您想了解有关泛型的更多信息,请阅读本教程:http://docs.oracle.com/javase/tutorial/java/generics/