对象与类<;T>;(vs类<;?>;?)在java中?

对象与类<;T>;(vs类<;?>;?)在java中?,java,generics,Java,Generics,我对Java非常陌生。这可能是个愚蠢的问题,但我在任何地方都找不到答案。如果您想要声明一个方法,该方法将接收未知对象并对其执行某些操作(例如,复制它),那么以下内容之间的区别是什么: <T> T func(Class<T> cls){ //do something } Object func(Object o){ //do something } T函数(类cls){ //做点什么 } 对象函数(对象o){ //做点什么 } 它们是否具有可比性?您

我对Java非常陌生。这可能是个愚蠢的问题,但我在任何地方都找不到答案。如果您想要声明一个方法,该方法将接收未知对象并对其执行某些操作(例如,复制它),那么以下内容之间的区别是什么:

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

Object func(Object o){
    //do something 
}
T函数(类cls){
//做点什么
}
对象函数(对象o){
//做点什么
}

它们是否具有可比性?您是否可以/愿意使用上述方法中的一种而不是另一种?而
在哪里适合呢?

代码中的区别在于前者
func
接收一个
类(可以是
Class
),这意味着该方法只接收一个类型。后者接收任何对象,不管它是类还是其他类型的对象

Class
javadoc:

类的实例表示正在运行的Java应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组还属于一个类,该类作为一个类对象反映,该类对象由具有相同元素类型和维度数的所有数组共享

请注意,
Class
是类的元数据


如果您的代码是这样的:

<T> T func(T o){
    //do something
}

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

Class
是一种非常特殊的对象类型<代码>类
不是任何类型对象的替代品,而是一个类描述符。在Java中,一切都是对象,类也是对象,因此有一种类型-
Class
,它对对象的“类”类进行抽象

下面是一个例子:

如果您有这个:

Class<Object> obj = Object.class;
func(obj);
Class obj=Object.Class;
func(obj);
,这并不意味着在
func
方法中,您可以访问
对象
实例;您将有权访问
实例,该实例是
对象
类的描述符


因此,为了回答您的问题,您应该使用
对象
来实现您声明的目的。

对象
在Java中是两种不同的东西。如果您想要获取任何类型的对象,而您不关心对象的类型,那么通常可以看到以下内容

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

使用
对象
声明函数比使用
声明函数更常见,因为传递类的步骤比传递对象的步骤多。

让我们来看看您的函数

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

将object作为参数并返回object,因此理论上,您可以插入类并返回实例,但也可以输入日期和接收字符串

第一个函数接受java.lang.class(这也是对象类的实例,因为类扩展了它。您可以在javadoc:)中找到有关该类的更多信息。 因此,第一个方法可以处理类的实例,但它不接受所有对象(注意大写字母,它是类的名称)

第二个方法接受所有对象(因为每个对象都扩展了java.lang.object)。(对象的javadoc:)

因此,如果您想创建一个可能“接收未知对象并对其进行处理”的方法,您必须使用第二种方法。您还应该知道,通常不需要接受任何对象或未知对象的方法,如果可以找到其他解决方案,则不应创建此类方法(因为这会导致代码更难阅读)

当您想要对类的定义做一些事情(检索字段、方法、构造函数等的列表)时,接受类作为参数的方法非常有用。此网页介绍如何使用该类:

此外,如果您想了解有关泛型的更多信息,请阅读本教程:

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