【问题标题】:How to interpret Java generics like <T> T , <T,V> Query<T> , Class<T>?如何解释 Java 泛型,如 <T> T 、 <T,V> Query<T> 、 Class<T>?
【发布时间】:2011-09-24 03:21:52
【问题描述】:

有Java API:Morphia

类 Morphia 定义方法如下:

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

有人能解释一下&lt;T&gt; T and Class&lt;T&gt; 的含义吗?该方法是否返回集合中类型为 T 的类?

Interface 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.

无论何时涉及到尖括号(&lt; &gt; ),是否总是意味着涉及到一个Java集合?

对不起,我忘记将这个问题中的一些内容标记为代码,否则 SO 正在逃避改变问题的整个含义,因此 @Vash 和 @fiver 的 2 个答案与此编辑之前的问题一致。

感谢您指出一些教程,但请根据您在 Java 泛型方面的专业知识提供具体答案,这将有助于我更好地理解教程。

【问题讨论】:

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

标签: java generics


【解决方案1】:

当你看到 时,这意味着泛型类——而不仅仅是集合。

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

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

所以DBFromObject方法是一个泛型方法,其中泛型类型用T表示,它返回这个泛型类型T的对象并接受Class&lt;T&gt;类型的参数。

【讨论】:

  • fromDBObject方法的返回部分,和T有什么区别?怎么理解?
  • 指定您要为此声明的未知类型指定的名称。 T 是函数的返回类型。可能是:&lt;T&gt; List&lt;T&gt; SomeFunction(T parameter) { return null; }
  • 如果我通过将第一个参数作为String.class传递来调用该方法,那么我们可以将返回部分视为 String,但这似乎很奇怪,我们希望返回为String,返回的部分应该只声明为 T,不是吗?
  • 如果传递String.class,那么T会被推断为String,所以结果类型应该是String。 只是指定函数是泛型的一种方式 - 它没有其他含义。
  • Class&lt;V&gt; 这样的东西怎么样?那里的V是什么意思?
【解决方案2】:

QueryClass 是 Java 类。

&lt;T&gt; 表示将使用一些通用参数 T。

请阅读tutorial,这将使您了解泛型。

【讨论】:

  • 教程链接坏了吗?
【解决方案3】:

泛型不限于集合,集合是很好的例子,可以帮助您了解为什么需要泛型以及如何使用它们。

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

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

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

现在您可以想象可以指定多个泛型类型的情况。这种情况的一个很好的例子是Map 类。您可以定义键和值的类型。所以你会在Map 类声明中看到&lt;K,V&gt; (Map&lt;K,V&gt;)。

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

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

有一个方法有两种泛型类型 T 和 V,您可以在调用该方法时指定它们(或者它们可以由编译器推断)。这里,声明中的&lt;T,V&gt;明确指出了这个方法特性。

【讨论】:

  • 你能解释一下 Query 是什么意思吗?该方法是否在集合映射中返回类型为 Query 的对象,其中键为 T 类型,值为 V 类型?
  • 它返回一个查询。它与收藏没有任何关系。 仅表示该方法有两种泛型类型:T 和 V。其中一种出现在 Query 和 Class 中,另一种作为参数类型(V 值)出现。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多