如何解释Java泛型,如<t> T,<t,v> Query <t>,Class <t>?</t> </t> </t,v> </t>

时间:2011-06-28 08:52:07

标签: java generics

有Java API:Morphia

类Morphia定义方法如:

<T> T fromDBObject(Class<T> entityClass, com.mongodb.DBObject dbObject)

有人可以解释<T> T and Class<T>的含义吗?该方法是否在集合中返回类型T的类?

Inteface DataStore上的另一个API:

<T,V> Query<T> find(Class<T> clazz, String property, V value) 

What <T,V> Query<T> means? Is the method returning an object of type Query that is then surrounded by collection `<T,V>` and `<T>`. This part is very confusing.

当涉及尖括号(< > )时,它是否正确,它总是意味着涉及Java集合?

抱歉,我忘了在这个问题中标记一些内容作为代码,否则SO正在逃避改变问题的全部含义,因此@Vash和@fiver的2个答案都符合此编辑前的问题。

感谢您指出一些教程,但请提供您在Java泛型方面的专业知识的特定答案,以帮助我更好地理解教程。

4 个答案:

答案 0 :(得分:6)

泛型不仅限于集合,但集合是理解为什么需要泛型以及如何使用它们的好例子。

假设您创建了一个新的List对象,并且您知道它只包含特定类型的对象(例如,MyClass个对象)。如果您可以在代码中以某种方式指定它并且可以自动检查它,那么您可以确保不会将任何其他类型的对象插入此列表。此外,当其他开发人员阅读您的代码时,他们很容易理解该列表仅包含“MyClass”对象。

泛型让我们在代码中包含这些信息而不重写List类。实际上,List功能独立于它包含的对象类型。因此,要创建自己的List,请编写以下代码:

         List<MyClass> myList = new List<MyClass>();

现在您可以想象可以指定多个泛型类型的情况。这种情况的一个很好的例子是Map类。您可以定义键和值的类型。因此,您在<K,V>类声明(Map)中看到Map<K,V>

除了Classes之外,泛型也可以用在方法/构造函数声明中。在您的示例中:

         <T,V> Query<T> find(Class<T> clazz, String property, V value) 

有一种方法有两种泛型类型T和V,你可以在调用方法时指定它们(或者它们可以由编译器推断)。这里,声明中的<T,V>明确指出了此方法功能。

答案 1 :(得分:4)

每当你看到&lt; &gt;,这意味着泛型类 - 而不仅仅是集合。

类只是泛型类的一个示例:http://download.oracle.com/javase/6/docs/api/java/lang/Class.html

声明中的T表示任何类型的对象(T是类型)。

因此DBFromObject方法是一种泛型方法,其中泛型类型用T表示,它返回此泛型类型T的对象并接受类型为Class<T>的参数。

答案 2 :(得分:0)

QueryClass是Java类。

<T>表示将使用某些通用参数T.

请阅读tutorial,这将向您阐明仿制药。

答案 3 :(得分:0)

public <T> T fromDBObject(Class<T> entityClass, com.mongodb.DBObject dbObject)是使用Class Literals as Runtime-Type Tokens的一个很好的例子。该声明与page底部附近的示例非常相似。一个阅读可能是,“给定类型为 T 的文字名为entityClassdbObject,方法fromDBObject()返回 T类型的对象。在这种情况下,符号 T 代表Class对象所代表的类型。