对象与类<t>(对于<? - ? - >?中的类<? - ? - >?)?</t>

时间:2014-06-24 15:51:58

标签: java generics

我对Java很新。这可能是一个愚蠢的问题 - 但我无法在任何地方找到答案。如果你想声明一个接收未知对象并对其做某事的方法(例如复制它),那么会有什么区别:

<T> T func(Class<T> cls){
    //do something
}

Object func(Object o){
    //do something 
}

他们可比吗?你有什么能用上述方法而不是其他方法吗? Class<?>在哪里适合?

5 个答案:

答案 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)

ClassObject是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/