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)
仍然是通用但限制类型.
interface当interfacea本身是另一种方法签名的一部分时,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方法.