Java 泛型接口与泛型方法,以及何时使用一个
2022-09-02 04:35:59
我想知道,除了语法差异之外,什么时候会使用泛型接口而不是接受泛型参数的方法?
public interface Flight<T>{
void fly(T obj);
}
多
public interface Flight{
void <T> fly(T obj);
}
我想知道,除了语法差异之外,什么时候会使用泛型接口而不是接受泛型参数的方法?
public interface Flight<T>{
void fly(T obj);
}
多
public interface Flight{
void <T> fly(T obj);
}
如果声明泛型方法,则始终让调用方决定要将哪些类型参数用于类型参数。该方法的实现必须能够处理所有可能的类型参数(它甚至没有办法请求实际的类型参数)。
也就是说,像这样的方法声明调用方可以使用任何类型,而实现唯一可以依赖的是的实际类型将可分配给(就像如果已经声明一样)。<T> void fly(T obj);
T
T
Object
<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) {
}
}
仍然是通用的,但限制了类型。
当一个本身是另一个方法签名的一部分时,签名也很重要,例如interface
interface
public void foo(Flight<? super String> f) {
f.fly("some string value");
}
在这里,传递给 的实现必须能够使用值,因此或或就足够了,但不是。声明这样的协定需要 类型参数在 上,而不是 在 的方法上。Flight
foo
String
Flight<String>
Flight<CharSequence>
Flight<Object>
Flight<Integer>
interface
interface
如果期望实现中的大多数方法将对实例化类时提供的类型执行操作,则应使用泛型类型。
例如,是泛型类型,因为它的大多数操作(添加、获取、删除等)都依赖于在创建泛型类型时指定的类型。ArrayList<E>
当类中只有少数方法依赖于不同类型的方法时,应使用泛型方法。
您可以在 Java 文档中阅读有关泛型的更多信息。