2011-06-28 54 views
4

还有的Java API:Morphia如何解释Java泛型如<T> T,<T,V>查询<T>,类<T>?

类吗啡定义方法,如:

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

有人能解释一下<T> T and Class<T>手段?该方法是否返回集合中的类型T的类?

上Inteface数据存储的另一个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

这里有很多通用的教程,阅读那些,不,泛型不仅用于集合。 – Dorus

回答

3

每当你看到<>,这意味着泛型类 - 不只是集合。

类仅仅是一个通用类的例子:在声明http://download.oracle.com/javase/6/docs/api/java/lang/Class.html

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

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

+0

在fromDBObject方法的返回部分,和T之间有什么区别?如何理解它? – didxga

+0

指定您想要为此声明的未知类型提供的名称。函数的返回类型。它可能是:' List SomeFunction(T parameter){return null; }' –

+0

如果我通过传递第一个参数作为String.class来调用这个方法,那么我们可以将返回部分看作 String,但它似乎很奇怪,我们希望返回为String,其中返回部分只应声明作为T,不是吗? – didxga

0

QueryClass是Java类。

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

请阅读tutorial,这会澄清你的泛型。

5

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

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

泛型让我们将这些信息包含在我们的代码中,而无需重写List类。实际上,List功能与其包含的对象的类型无关。因此,要创建自己的List你写这样的代码:

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

现在你能想象在那里可以指定多个泛型类型案件。这种情况的一个好例子是Map类。您可以定义键和值的类型。所以您在Map类声明中看到<K,V>Map<K,V>)。

除了类,泛型也可以在方法/构造函数声明中使用。在您的例子:

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

有它有两个泛型类型T和V的方法,你可以指定它们(或它们可以通过编译器可以推断),当你调用该方法。这里,<T,V>在声明中明确指出了这个方法的特征。

+0

你能解释一下吗?查询是什么意思?该方法返回类型为查询的对象在集合映射中,其中键的类型为T,值的类型为V? – ace

+2

它返回查询。它与收藏无关。 仅表示该方法具有两种通用类型:T和V.其中一个出现在查询和类中,另一个出现为参数类型(V值)。 –