java开发——为什么要使用泛型?用Object不行吗?

答案是可以的!也就是说泛型可以实现的功能,用Object也是可以实现的。

那为什么还要使用泛型呢?因为泛型有如下优点:

1、无须类型强转,提高效率,避免了强转出错。

2、通配符"?"的使用提高了程序的阅读性。

3、限制通配符(<? extends T>、<? super T>)提高了程序的健壮性。

所以,可以使用泛型就尽量使用泛型吧!

 

 下面举例说明一下第2条和第3条:

例子1:Collection<E>泛型接口的removeAll()方法:

    boolean removeAll(Collection<?> c);

我们知道Collection是众多集合的顶层接口(List、Set等),Collection容器中包含的元素类型是任意的,也就是说removeAll方法必须是与类型无关的一个方法。所以这个问号"?"是不是很形象呢!

 

例子2:ArrayList泛型类的addAll()方法:

public boolean addAll(Collection<? extends E> c) {
        Object[] a = c.toArray();
        int numNew = a.length;
        ensureCapacityInternal(size + numNew);  // Increments modCount
        System.arraycopy(a, 0, elementData, size, numNew);
        size += numNew;
        return numNew != 0;
}

看到上面的参数Collection<? extends E>,说明这个c必须是E类型或者E的子类。如果你很粗心,什么都往ArrayList里面加,编译器可不会答应。

ArrayList<String> stringArrayList = new ArrayList<>();
ArrayList<Object> objectArrayList = new ArrayList<>();
stringArrayList.addAll(objectArrayList);//编译器直接给你报错了
objectArrayList.addAll(stringArrayList);//可以

如果是用Object实现的ArrayLis而不是使用泛型,需要等到运行期间才会报类型强转错误了。因此使用了泛型,好处多多,程序很健壮!!

 

细节补充:

1、有没有发现通配符"?"出现的地方基本都是在方法的参数中!!因为通配符"?"负责接收信息。

2、类型擦除是泛型出现以后才有的。List<T>中,List<Object>和List<String>都是List.class,Object和String被擦除了。

3、泛型方法是需要<T>进行声明的,泛型方法可以独立于泛型类和泛型接口而存在的。

    //<T>的作用:1、声明的此方法为泛型方法;2、定义了参数中的T
    public <T> void genericsMethod(T t){
        //do something with t
    }

 4、可以用Collection<T>代替Collection<?>吗?答案是可以的,改为泛型方法!

//将boolean removeAll(Collection<?> c);改为泛型方法。
<T> boolean removeAll(Collection<T> c);

 

如果对您有用的话赞一下呗!谢谢啦!

### Java集合的概念与用法 #### 一、基本概念 Java集合是一种类安全机制,用于增强代码的安全性和可读性。通过使用集合,可以在编译阶段捕获潜在的类错误,从而减少运行时异常的发生[^1]。 #### 二、常见集合类 Java提供了多种常用的集合类,其中`ArrayList`是最常见的实现之一。以下是创建同类的`ArrayList`示例: ```java // 创建一个存储字符串的ArrayList ArrayList<String> list1 = new ArrayList<>(); // 创建一个存储整数的ArrayList ArrayList<Integer> list2 = new ArrayList<>(); ``` 上述代码展示了如何利用指定集合中元素的具体类,这使得操作更加直观且减少了强制类转换的需求[^2]。 #### 三、的作用 允许开发者以一种通用的方式来定义类和方法,而无需提前确定具体的数据类。这种灵活性类似于C++中的模板功能,但在实际应用过程中,具体的类是在实例化对象或调用函数时才被确认下来[^3]。 #### 四、未指定的情况 如果在声明集合时指明其,则该集合会默认采用`Object`作为基础类。这意味着可以向此类集合添加任意类的对象,但这可能会引发类安全性问题以及增加必要的类转换工作量[^4]。 #### 五、通配符的应用 为了使程序具有更大的适应范围,有时需要处理确定确切类的集合。此时可以通过引入通配符(`?`)来表示未知类。例如,当希望某个方法能够接收任何形式的列表参数时,可以这样定义它: ```java public void processList(List<?> list) { for (Object element : list) { System.out.println(element); } } ``` 这里使用的`?`意味着此方法能兼容所有种类别的列表输入[^5]。 #### 六、注意事项 值得注意的是,尽管源代码里可以看到带有标记的各种结构体,但是一旦经过javac编译器处理之后生成最终class文件形式后,所有的信息都将丢失——这就是所谓的“擦除”。因此可以说Java里的所谓“”,实际上只是存在于开发期间的一个辅助工具而已,并会直接影响到执行层面的行为特性。 ### 总结 综上所述,掌握并合理运用好Java中的集合对于提升软件质量有着重要意义;它们仅简化了编码流程还加强了系统的健壮程度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值