JAVA的Collection接口中的方法containAll()在定义泛型形参时,为什么要使用通配符?

比如这个方法我的想法是把<?>去掉,刚才测试过了,去掉之后,传入一个带泛型的实例运行起来是没有任何错误了,测试如下图所示,上面分别写了两个Apple类,其中的text方法... 比如这个方法

我的想法是把<?>去掉,刚才测试过了,去掉之后,传入一个带泛型的实例运行起来是没有任何错误了,测试如下图所示,

上面分别写了两个Apple类,其中的text方法中的形参,一个同Collection接口中的containAll方法一样用了通配符,另一个没有使用,出现了警告,但用TestFanXing这个类去调用,运行结果是一样的,有没有通配符没有任何影响,那返回第一张图片去讲,为什么sun公司要在定义Collection接口中的方法时泛型形参要使用通配符去表示呢?
展开
 我来答
fuhaiwei
推荐于2016-04-16 · TA获得超过3409个赞
知道大有可为答主
回答量:974
采纳率:75%
帮助的人:1386万
展开全部
import java.util.ArrayList;
import java.util.Collection;

public class Test {

public static void main(String[] args) {
acceptList1(new ArrayList<String>());
acceptList2(new ArrayList<String>());
acceptList3(new ArrayList<String>());
}

//第一种方法是不推荐的,因为在支持泛型的地方没有指定泛型,会导致编译警告
public static void acceptList1(Collection c) {
}

//第二种方法,实际上就是接受任何种类的泛型,这正是该方法需要的
public static void acceptList2(Collection<?> c) {
}

//第三种方法,编译警告,竟然不接受Object的子类
public static void acceptList3(Collection<Object> c) {
}

//其实第三种方法可以写作Collection<? extends Object>,但这是多此一举
}


任何一本教科书上都会说明,Java的泛型是伪泛型,编译后泛型信息会消除掉。

也就是所谓的泛型擦除,所以写了泛型和没写泛型差不错。

泛型只是一种语法糖,只是帮你存入时检查类型,取出时强制转型而已。

coldwraith
2014-09-15 · TA获得超过139个赞
知道小有建树答主
回答量:110
采纳率:0%
帮助的人:126万
展开全部
用Collection<?> a的形参的函数就强制传进去的参数必须为泛型,不用就不强制。

你在testFanXing里面传进去的都是泛型的,所以两个都不报错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蓝风水晶灵
2014-09-15 · TA获得超过934个赞
知道小有建树答主
回答量:731
采纳率:0%
帮助的人:435万
展开全部
Java泛型有通配符?,表示任何类型

泛型符:T、E、V等,则是T代表一种类型,与?的区别就是,T所有的类型需要一致,而任何?则可以是任何类型。

泛型是对类型做一种限制,java里的泛型是一种伪泛型,所以不指定泛型也没问题,但是不指定泛型就意味着有可能会出错,所以编译器才会给出警告。

泛型有:
? 任何类型
T 一类类型
? extends T 上限限定
? super T 下限限定

目的:无需开发人员手工编码进行类型强转,指定泛型,由编译器自动检测并帮你强转,这样不会出现强转时类型错误。

新的JDK(好像是1.6以上版本吧),泛型的信息好像可以带到运行期的,而1.5的则不会吧,但依旧是一种伪泛型。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式