理解Java中的泛型方法

时间:2013-11-27 18:53:54

标签: java android generics

我正在尝试了解我在现有Android应用中阅读的方法。该方法的声明如下:

protected <V, T extends Result> void postObject(final V input, final T result, final ConnectionTarget endpoint, final boolean restart, final int id, final LoaderProvider provider, final ServiceCallbacks<T> callbacks) {

我刚读过关于泛型的内容,所以我或多或少地了解这里发生了什么,但不完全清楚。因此,我有两个问题:

  1. input应该是一个类型(即一个类),还是应该只是一个任何类型的对象?
  2. <V, T extends Result>是什么意思?据我所知,该地方应始终描述该方法的返回类型,但它已经在其后面显示void,此外,它同时表示VT
  3. 有人可以举例说明如何调用此方法吗?

2 个答案:

答案 0 :(得分:3)

我会将其拆分为较小的部分,以便更容易理解。 在以下部分:

protected <V, T extends Result> void

<V, T extends Result>是可选部分(通常不存在),用于指定泛型类型(或未知对象类型)。这由<>指定,并且任何逗号分隔值都是一个单独的对象(对象'T'必须扩展Result)。

这意味着稍后在方法调用中:

... postObject(final V input,...

该输入属于对象类型V,这意味着它可以是您想要的任何对象。

修改

调用此方法的基本示例是:

//Now post it
postObject("my input object", null /*Your result class*/, null /*your endpoint*/, true, 0, null /*your loaderProvider*/, null /*your callbacks*/);

答案 1 :(得分:2)

考虑此方法定义的<V, T extends Result>部分的最佳方法是将其视为将包含在方法签名本身中的泛型参数的声明。通过此定义,您可以确保您的参数来自特定类型(在您的示例中T必须是Result的子类),并且还允许您的签名在T时不会阻塞和V被引用。就你的问题而言:

  1. input可以只是任何类型的对象
  2. <V, T extends Result>只是意味着您将在方法签名中使用两个通用参数,其中任何V参数都可以是任何类型的对象,并且任何T参数都需要Result
  3. 的子类