有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泛型方面的专业知识的特定答案,以帮助我更好地理解教程。
答案 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)
答案 3 :(得分:0)
public <T> T fromDBObject(Class<T> entityClass, com.mongodb.DBObject dbObject)
是使用Class Literals as Runtime-Type Tokens的一个很好的例子。该声明与page底部附近的示例非常相似。一个阅读可能是,“给定类型为 T 的文字名为entityClass
和dbObject
,方法fromDBObject()
返回 T类型的对象。在这种情况下,符号 T 代表Class
对象所代表的类型。