JAVA的Collection接口中的方法containAll()在定义泛型形参时,为什么要使用通配符?
比如这个方法我的想法是把<?>去掉,刚才测试过了,去掉之后,传入一个带泛型的实例运行起来是没有任何错误了,测试如下图所示,上面分别写了两个Apple类,其中的text方法...
比如这个方法
我的想法是把<?>去掉,刚才测试过了,去掉之后,传入一个带泛型的实例运行起来是没有任何错误了,测试如下图所示,
上面分别写了两个Apple类,其中的text方法中的形参,一个同Collection接口中的containAll方法一样用了通配符,另一个没有使用,出现了警告,但用TestFanXing这个类去调用,运行结果是一样的,有没有通配符没有任何影响,那返回第一张图片去讲,为什么sun公司要在定义Collection接口中的方法时泛型形参要使用通配符去表示呢? 展开
我的想法是把<?>去掉,刚才测试过了,去掉之后,传入一个带泛型的实例运行起来是没有任何错误了,测试如下图所示,
上面分别写了两个Apple类,其中的text方法中的形参,一个同Collection接口中的containAll方法一样用了通配符,另一个没有使用,出现了警告,但用TestFanXing这个类去调用,运行结果是一样的,有没有通配符没有任何影响,那返回第一张图片去讲,为什么sun公司要在定义Collection接口中的方法时泛型形参要使用通配符去表示呢? 展开
展开全部
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的泛型是伪泛型,编译后泛型信息会消除掉。
也就是所谓的泛型擦除,所以写了泛型和没写泛型差不错。
泛型只是一种语法糖,只是帮你存入时检查类型,取出时强制转型而已。
展开全部
用Collection<?> a的形参的函数就强制传进去的参数必须为泛型,不用就不强制。
你在testFanXing里面传进去的都是泛型的,所以两个都不报错
你在testFanXing里面传进去的都是泛型的,所以两个都不报错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Java泛型有通配符?,表示任何类型
泛型符:T、E、V等,则是T代表一种类型,与?的区别就是,T所有的类型需要一致,而任何?则可以是任何类型。
泛型是对类型做一种限制,java里的泛型是一种伪泛型,所以不指定泛型也没问题,但是不指定泛型就意味着有可能会出错,所以编译器才会给出警告。
泛型有:
? 任何类型
T 一类类型
? extends T 上限限定
? super T 下限限定
目的:无需开发人员手工编码进行类型强转,指定泛型,由编译器自动检测并帮你强转,这样不会出现强转时类型错误。
新的JDK(好像是1.6以上版本吧),泛型的信息好像可以带到运行期的,而1.5的则不会吧,但依旧是一种伪泛型。
泛型符:T、E、V等,则是T代表一种类型,与?的区别就是,T所有的类型需要一致,而任何?则可以是任何类型。
泛型是对类型做一种限制,java里的泛型是一种伪泛型,所以不指定泛型也没问题,但是不指定泛型就意味着有可能会出错,所以编译器才会给出警告。
泛型有:
? 任何类型
T 一类类型
? extends T 上限限定
? super T 下限限定
目的:无需开发人员手工编码进行类型强转,指定泛型,由编译器自动检测并帮你强转,这样不会出现强转时类型错误。
新的JDK(好像是1.6以上版本吧),泛型的信息好像可以带到运行期的,而1.5的则不会吧,但依旧是一种伪泛型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询