Java函数声明中<T, U extends T>的含义是什么?

7
我看到了这个:


public static <T,U extends T> AutoBean<T> getAutoBean(U delegate)

我知道输入类是U类型,而AutoBean类是T类型,而且U扩展了T的边界。但是这里的<T,意味着什么?
此外,如果我要编写一个函数来接受getAutoBean的输出,你会如何编写函数声明?(即我的函数(myFunction(getAutoBean(...))),myFunction()的函数声明将是什么?)
谢谢!

1
你是故意将 <T 放在一起吗? < 符号只是 <> 括号的一部分。 - Retsam
不,我只是在询问<>括号中的T是否扩展了前面的U中的T。 - user1589188
该声明可能需要改进,例如 <U> AutoBean<? super U> getAutoBean(U delegate) - ZhongYu
1
该签名等同于 public static <T> AutoBean<T> getAutoBean(T delegate)U 是不必要的。 - newacct
5个回答

4

<T,U extends T>声明了一个静态方法的类型参数。这个方法有两个类型参数,一个类型是T,第二个类型 U 继承了第一个类型。

当你明确指定类型参数绑定时,它们可以不同,例如:

AutoBean<Object> autoBean = Foo.<Object, String>getAutoBean("delegate");

假设 getAutoBean 是类 Foo 的成员。

4

这只是声明了你的方法所涉及的类型。也就是说,它基本上必须先声明泛型类型名称,然后才能在签名中使用它们。 <T本身并没有任何意义,但是尖括号内的字母表示“这里是我将在该方法中使用的类型”。

至于如何使"myFunction()"与getAutoBean(...) 的输出配合使用:

public static  <T> String myFunction(AutoBean<T> arg){ // 如果您返回一个泛型类型对象,则还必须在第一个尖括号和其后的尖括号中声明其类型参数。
    // 在这里处理工作
}

谢谢!我以为public static String就足以说明返回类型是String了。我不知道在String之前需要加一个额外的<T>(就像在我的原始问题中的<T,>)。 - user1589188
如果你要这样做,那么最好将其声明为public static String myFunction(AutoBean<?> arg) - newacct
@Ibolit 抱歉,你知道“你的方法处理的类型”这个概念的解释吗?直到现在我一直认为,任何方法都会处理它的参数,并从括号中的类型声明中了解它们的类型(例如method(String arg1))。 - BairDev
@malte 对不起,我无法为您提供100%准确的答案,但在上面的示例中,类型实际上是未知的,它不是AutoBean,而是由其他东西参数化的AutoBean。我们还不知道是什么,T不是一种类型,而是一种变量。如果它在类声明中声明,我们就不需要在返回类型之前在方法声明中使用它。我相信有更好的解释。 - Ibolit

4

<T> 是方法返回的 AutoBean 的类型。 同时注意,输入参数的类型 <U> 必须扩展类型 <T> 才能调用该方法。


2
这意味着类型U必须扩展类型T。例如,这些类型可以用来替代TU
class TType { }
class UType extends TType { }

关于<T,的含义,它声明了在函数中使用的泛型类型。以下是一个例子:
UType uType = new UType();
AutoBean<TType> autobean = getAutoBean(uType);

2
正如lbolit所说,该声明指定了你的方法处理的内容,即在这种情况下返回类型为T和参数U,U是T的子类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接