Java 泛型接口返回泛型

Dow*_*ski 6 java generics

我从教程中找到了这段代码,我猜测该方法的getUriBase返回类型是String,但不清楚<T extends IEntity>该方法中正在发挥什么作用以及为什么将其放在开头?

public interface IUriMapper {
    <T extends IEntity> String getUriBase(final Class<T> clazz);
}
Run Code Online (Sandbox Code Playgroud)

hag*_*wal 4

这是创建泛型方法的约定。

泛型方法的语法包括类型参数、尖括号内并出现在方法的返回类型之前。对于静态泛型方法,类型参数部分必须出现在方法的返回类型之前。

如果您在返回类型之前看到String您定义了类型参数T。现在,<T extends IEntity>基本上您正在创建一个有界类型参数,其中您告诉编译器它T应该只是 的子类IEntity。

需要注意的重要一点是,您需要<T extends IEntity>在方法之前定义(这就是您所说的“通用方法”,更多信息即将到来...),因为您的接口不是通用类型,假设您的接口如下所示,那么您需要不要定义T类型参数,因为编译器会知道什么是T类型参数。

public interface IUriMapper<T extends IEntity> {
    String getUriBase(final Class<T> clazz);
}
Run Code Online (Sandbox Code Playgroud)

因此,当您想要定义自己的类型时,基本上泛型方法很有用(或者换句话说,适用于某些情况)。考虑下面的示例,其中您的泛型类型(您的接口“IUriMapper”)定义了类型参数“T”,但对于getUriBase您正在创建新类型“E”的方法

public interface IUriMapper<T extends IEntity> {
    <E extends Number> String getUriBase(final Class<E> clazz);
}
Run Code Online (Sandbox Code Playgroud)

此 Oracle 文档是学习泛型的最佳来源。