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

yev*_*yev 16 java generics methods interface parameterized

我想知道,除了语法差异,何时会使用通用接口而不是接受通用参数的方法?

public interface Flight<T>{
   void fly(T obj);
}
Run Code Online (Sandbox Code Playgroud)

过度

public interface Flight{
    void <T> fly(T obj);
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 13

如果声明泛型方法,则始终让调用者决定使用哪种类型参数作为类型参数.该方法的实现必须能够处理所有可能的类型参数(并且它甚至没有办法要求实际的类型参数).

也就是说,一种类似于<T> void fly(T obj);调用者可以使用任何类型的方法,T而实现可以依赖的唯一方法是T可以分配的实际类型Object(如果<T extends Object>已声明).

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

与此相反,上的一个类型参数interface是合同的一部分,并且可以通过一个指定或限制实现interface:

public interface Flight<T>{
   void fly(T obj);
}
Run Code Online (Sandbox Code Playgroud)

允许类似的实现

public class X implements Flight<String> {
   public void fly(String obj) {
   }
}
Run Code Online (Sandbox Code Playgroud)

修复T实现方面的类型.要么

public class NumberFlight<N extends Number> implements Flight<N> {
   public void fly(N obj) {
   }
}
Run Code Online (Sandbox Code Playgroud)

仍然是通用但限制类型.


interfaceinterfacea本身是另一种方法签名的一部分时,a 的签名也很重要,例如

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

这里,将Flight实施,这将传递给foo,必须能够消耗的String值,所以Flight<String>Flight<CharSequence>Flight<Object>有足够的,但不是Flight<Integer>.声明这样的合同需要类型参数interface,而不是interface方法.