Java 泛型接口与泛型方法,以及何时使用一个

我想知道,除了语法差异之外,什么时候会使用泛型接口而不是接受泛型参数的方法?

public interface Flight<T>{
   void fly(T obj);
}

public interface Flight{
    void <T> fly(T obj);
}

答案 1

如果声明泛型方法,则始终让调用方决定要将哪些类型参数用于类型参数。该方法的实现必须能够处理所有可能的类型参数(它甚至没有办法请求实际的类型参数)。

也就是说,像这样的方法声明调用方可以使用任何类型,而实现唯一可以依赖的是的实际类型将可分配给(就像如果已经声明一样)。<T> void fly(T obj);TTObject<T extends Object>

因此,在这个具体的例子中,它与声明没有什么不同,后者也允许任意对象。void fly(Object obj);

相反,接口上的类型参数是协定的一部分,可以通过以下实现来指定或限制:interface

public interface Flight<T>{
   void fly(T obj);
}

允许实现如下

public class X implements Flight<String> {
   public void fly(String obj) {
   }
}

在实现端修复 的类型。或T

public class NumberFlight<N extends Number> implements Flight<N> {
   public void fly(N obj) {
   }
}

仍然是通用的,但限制了类型。


当一个本身是另一个方法签名的一部分时,签名也很重要,例如interfaceinterface

public void foo(Flight<? super String> f) {
    f.fly("some string value");
}

在这里,传递给 的实现必须能够使用值,因此或或就足够了,但不是。声明这样的协定需要 类型参数在 上,而不是 在 的方法上。FlightfooStringFlight<String>Flight<CharSequence>Flight<Object>Flight<Integer>interfaceinterface


答案 2

如果期望实现中的大多数方法将对实例化类时提供的类型执行操作,则应使用泛型类型。

例如,是泛型类型,因为它的大多数操作(添加、获取、删除等)都依赖于在创建泛型类型时指定的类型。ArrayList<E>

当类中只有少数方法依赖于不同类型的方法时,应使用泛型方法。

您可以在 Java 文档中阅读有关泛型的更多信息。