Java通用类型语法

时间:2014-08-29 12:39:46

标签: java generics syntax

<D extends com.j256.ormlite.dao.Dao<T,?>,T> D getDao(Class<T> clazz)

我无法理解上述陈述

getDao(Class clazz)返回D

D有以下约束

D extends com.j256.ormlite.dao.Dao<T,?>

和额外,T 我无法理解。

你能解释一下吗?

2 个答案:

答案 0 :(得分:2)

此方法包含两个类型参数DT,其中D具有额外的extends约束,具体取决于{{1 }}。不要对这个T语法感到困惑; <T,?>,T not 属于约束,但是第二个参数,告诉Java ,T不是具体类的名称。

如果添加空格或交换参数,它将更清晰。这是一个类似但有点简单的例子。这些方法签名都是等效的:

T

请记住,尽管<D extends List<T>,T> D createListOf(Class<T> clazz) // your version <D extends List<T>, T> D createListOf(Class<T> clazz) // extra space <T, D extends List<T>> D createListOf(Class<T> clazz) // different order 似乎很明显是另一个类型参数,但Java并不清楚。可能有一个名为T的实际类,因此我们必须明确T是一个类型参数。

T

相反,类型参数不限于单个字符。如果您想彻底混淆同事,也可以使用名为class T { ... } // this T is not what I want! 的类型参数,甚至是Foo。也许这表明为什么使用String声明所有类型参数是必要的。

<...>

答案 1 :(得分:1)

此方法将:

  • 返回D
  • 类型的对象
  • D是或com.j256.ormlite.dao.Dao的位置,使用T类型的对象或扩展/实施T和未知类型参数进行参数化
  • 如果作为参数给出类型T
  • 的类

它使用了很多通用抽象,这并不奇怪,因为它提供了DAO(数据访问对象)。