数组与泛型容器区别

一。基本

class Shape{
    void draw(){
        System.out.println(this+".draw()");
    }
}

class Circle extends Shape{
    @Override
    public String toString() {
        return "Circle";
    }
}
class Rect extends Shape{
    @Override
    public String toString() {
        return "Rect";
    }
}

class Triangle extends Shape{
    @Override
    public String toString() {
        return "Triangle";
    }
}

class Square extends Rect{
    @Override
    public String toString() {
        return "Square";
    }
}

二。示例

 1         Shape[] shapes = new Rect[10];
 2         shapes[0] = new Rect();
 3         //Shape类型的引用当然可以放入Circle。但数组在运行时能保留它存储的对象类型的倣,运行时是Rect,因此运行出错
 4         //shapes[1] = new Circle(); // java.lang.ArrayStoreException
 5
 6          //数组与泛型容器的区别:数组有协变类型,而泛型容器没有内建协变类型
 7         List<Shape> list = new ArrayList<Rect>();  //错误
 8         List<? extends Shape> list = new ArrayList<Rect>();
 9         //放不进任何元素。
10         //list.add(new Circle());
11         //list.add(new Rect());
12
13         List<Rect> list = new ArrayList<Rect>();
14         //list.add(new Circle()); //泛型容器将运行时检查提前到编译期
15         list.add(new Rect());
16         list.add(new Square());
17         for(Rect rect : list){
18             rect.draw();
19         }

数组与泛型容器区别

时间: 2024-10-07 06:31:19

数组与泛型容器区别的相关文章

从头认识java-13.11 对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题?

这一章节我们继续类型擦除的话题,我们将通过对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题? 1.数组 package com.ray.ch13; public class Test { public static void main(String[] args) { Fruit[] fruits = new Apple[5]; fruits[0] = new Apple(); fruits[1] = new Fuji(); fruits[2] = new Fruit(); } } cla

从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?

这一章节我们继续类型擦除的话题,我们将通过对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题? 1.数组 package com.ray.ch13; public class Test { public static void main(String[] args) { Fruit[] fruits = new Apple[5]; fruits[0] = new Apple(); fruits[1] = new Fuji(); fruits[2] = new Fruit(); } } cla

协变、逆变与不变:数组、泛型、与返回类型

转自:http://blog.csdn.net/yi_Afly/article/details/52071260 1. 前言 之前几篇博文,有些地方涉及到了协变性.逆变性与不变性在Java中的表现,所以这篇博文将重点记录这方面的内容,并辅以JDK源码中的一些实例,加以说明. 2. 定义 这里讨论的协变.逆变与不变都是编程语言中的概念.下面介绍定义: 若类A是类B的子类,则记作A ≦ B.设有变换f(),若: 当A ≦ B时,有f(A)≦ f(B),则称变换f()具有协变性. 当A ≦ B时,有f

数组与指针的区别,以及在STL中传递数组/指针

数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = { 1,2,3,4,5 }; f(a); 上述代码输出的是4(32位系统)或8(64位系统),总之不是sizeof(int) * 5(数组大小). 为什么明明形参是数组形式的int [],实际上和指针形式的int *无异呢?关键原因就在于,数组是不能作为左值的. 也就是说,你不能定义两个数组,比如int a[

C++制作一个泛型容器(可以盛放各种类型的对象)

如果你想要一个可以盛放各种类型的对象,那么基本上可以说在C++里没有,或者你可以用vector<boost::any>或者其他的什么来模拟,我说那都不怎么好.问题就在于我的类型会在运行时动态的增加,你不可能知道我会增加什么类型,我的头文件也不会给你. 现在是不是觉得C++的泛型用不上了,是的,C++的泛型本质上是对相似代码的复用,做的事情都是同一件事情,但仅仅是处理类型的差别.这种情况用的还是比较少的,比如vector,queue,map等这些容器是用泛型的最好的地方了.但你想过没有,这些类型

Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList&lt;T&gt;

Delphi 2009 新增了泛型容器单元: Generics.Collections, 同时还有一个 Generics.Defaults 单元做支持. Generics.Collections 包含了以下实用类:TList<T>TQueue<T>TStack<T>TDictionary<TKey,TValue>TObjectList<T>TObjectQueue<T>TObjectStack<T>TObjectDicti

数组和集合的区别

数组:数组是java语言内置的数据类型,他是一个线性的序列,所有可以快速访问其他的元素,数组和其他语言不同,当你创建了一个数组时,他的容量是不变的,而且在生命周期也是不能改变的,还有JAVA数组会做边界检查,如果发现有越界现象,会报RuntimeException异常错误,所有不用担心和C和C++一样不做边界检查而出现的问题,当然检查边界会以效率为代价,数组和其他容器体现在3个方面:1.效率2.类型识别3.可以持有primitives. 集合: JAVA还提供其他容器,list,map,set,

php 合并数组 &quot;+&quot;和&quot;array_merge&quot;的区别

主要区别是两个或者多个数组中如果出现相同键名,键名分为字符串或者数字,需要注意 1)键名为数字时,array_merge()不会覆盖掉原来的值,但+合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(不是覆盖) 2)键名为字符时,+仍然把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉,但array_merge()此时会覆盖掉前面相同键名的值 <?php$array1 = array(0 => 'zero_a', 2 => 

(实用篇)PHP中unset,array_splice删除数组中元素的区别

php中删除数组元素是非常的简单的,但有时删除数组需要对索引进行一些排序要求我们会使用到相关的函数,这里我们来介绍使用unset,array_splice删除数组中的元素区别吧 如果要在某个数组中删除一个元素,可以直接用的unset,但是数组的索引不会重排: <?php $arr = array('a','b','c','d'); unset($arr[1]); print_r($arr); ?> 结果是: Array ( [0] => a [2] => c [3] => d