泛型(7)-泛型方法与类型通配符的区别

大多数时候可以使用泛型方法来代替类型通配符.例如

package com.j1803;
public interface Collection<E> {
boolean containAll(Collection<E> C);
boolean addAll(Collection<? extends E> C);
}
//可以改写成
public interface Collection {
<T> boolean containAll(Collection<T> C);
<T> boolean addAll(Collection<T> c);
}
上面方法使用了<T extends E>泛型形式,这时定义泛型形参时设定上限(其中E是Collection接口)里定义的泛型,在该接口里E可以当成普通类型).
上面的两个方法中泛型E只使用一次,泛型形参T产生的唯一效果是可以在不同的调用点传入不同的实际类型.对于这种情况,应该使用通配符:通配符就是被设计用来支持灵活的子变化的.
泛型方法允许泛型形参被用来表示方法的一个或者多个参数之间的类型依赖关系,或者方法返回值与参数之间的类型依赖关系.如果没有这种类型依赖关系,就不应该使用泛型方法.
如果某个方法中一个形参(a)的类型或者返回值的类型依赖于另一个形参(b)的类型,则形参(b)的类型声明不应该使用通配符,因为形参(a)或返回值的类型依赖于该形参(b)的类型,如果(b)的类型无法确定,程序就无法定义
形参(a)的类型,在这种情况下,只能考虑使用在方法签名中声明泛型也就是泛型方法.

类型通配符与泛型方法(在方法签名中显示声明泛型形参)还有一个显著的区别:类型通配符既可以在方法签名总定义形参的类型,也可以用于定义变量的类型;但是泛型方法中的泛型形参必须在对应方法中显示声明.
原文地址:https://www.cnblogs.com/shadow-shine/p/9658391.html