java基础篇--06<java泛型>
来源:互联网 发布:易趣网与淘宝网的不同 编辑:程序博客网 时间:2024/06/05 17:17
========
java中的集合元素被丢进去之后就失去了类型讯息,在当取出的时候就都成为了Object的类型
集合加入泛型可以帮助集合记忆这些讯息;
泛型基础讯息:
1》修饰类的时候,写在类的后方,区别:在调用的时候需要指明具体类型
List<String>listString = new ArrayList<String>();
2》修饰方法,写在返回值前,区别:在调用的的时候会根据传入的参数指明具体类型
private<T> void Test(T a){}
inta;
Stringa;
Test(a);
如上T会根据传入的a的类型变成int|| String,不需要像类和接口那样再调用的时候指明
3》修饰变量,可以作为普通的修饰词来使用
可以理解:一种特殊的修饰词,除了类之外,可以看到《》的摆放位置都是和正常的修饰词一致
泛型+extends:
class Apple <T>{T info;}//这样写是错误的,算是使用Apple,就必须传入实际的类型class Orange extends Apple<T>{}//这样传入实际参数,正确class Orange1 extends Apple<String>{}//不传参数,默认Object,正确,这时会报警告:使用了未经检查或不安全的操作class Orange2 extends Apple{}
泛型+编译
//可以看到这里的泛型很好的限定了List中存储数据的类型List<String> list = new ArrayList<String>();List<Integer> list2 = new ArrayList<Integer>();//打印结果相等,不管泛型的实际类型参数是什么,//他们在运行的时候总有同样的类(共一个.class文件)System.out.println(list.getClass() == list2.getClass());
泛型+static
静态的东西不能加入<>,因为在使用的时候无法确认泛型的具体代表的实际类型,原理和3中的第一个例子相似
泛型+包含关系
List<String>并不能直接用List<Object>这种类型来接,他们并不是包含关系,是两个完全不同的类型
泛型+通配符重要:解决了6中的问题
1》基础:List<?>表示可以匹配任何类型
//以下开始限定范围了
2》设置上限:List<?extends String> 表明是一个String类型或者是他的子类,上限String
3》设置下限:List<?super String> 表明是一个String类型或者是他的父类,下限String
4》使用范围:一般在参数中使用,不可直接用于赋值,详见下8中例子
不能对任何带<?>通配符的类型进行复赋值操作(B继承A)
List<? extends A> listb = new ArrayList<B>();listb.add(new B()); //上面的例子是错的,因为listb是一个带通配符的,so, //它是一个不确定的类型,不能进行任何add操作 //,操作之前可以先进行强制类型转换//可以强制类型转换成A或者A的子类List<A> listA = (List<A>)listb;listA.add(new A());List<B> listB = (List<B>)listb;listB.add(new B());//注意:强制类型转换过后就为”确定的A&B类型“了,就不能在赋值给List<A>List<A> listAA = (List<A>)listB;
注意:Bextends A,且
List<A>listA =(List<A>)listb;
listA.add(newB());
正确,但是List<A>= List<B>是错误的,这两个类型并不具有包含关系,他们是两个各自独立的类型,就像本文6中所说的那样
泛型+方法
private<T> void Test(T a){}
此时在方法Test中,T即被当做一个普通类型来使用
当方法有多个参数的时候,且参数之间的类型有着关系,这时候需要使用<?>通配符来表达
<T> void eat(List<? extends T> a,List<T> b){System.out.println("eat");}public static void main(String[] args) {Test test = new Test();test.eat(new ArrayList<B>(), new ArrayList<A>());}
泛型+构造器(可以理解构造器是类的一种特殊方法,与普通方法的有点区别)
public <T> Test(T t) {}<E> void eat(E e){}public static void main(String[] args) {String t = "test";Test test = new Test(t);Test test1 = new <A>Test(new A());test.eat(t);test1.<A>eat(new A());}
可以看到基本功能一样,调用的时候都可以选择指定或者不指定<T>泛型的具体类型
小知识:
List<>= List //调用不当(List实际存储的类型与<>中的不匹配)的时候会导致异常
List= List<> //丢失TYPE,直接变成List的上限
- java基础篇--06<java泛型>
- Java基础 Java 泛型
- Java基础篇系列:Java泛型
- java基础--java开始篇
- 【Java面试】java基础篇
- [Java基础]Java基础篇
- java基础篇--01<基础>
- Java基础-多线程基础篇
- Java语言基础:泛型
- java基础加强--泛型
- Java基础加强---泛型
- Java基础_泛型
- java基础---->泛型
- java基础:泛型
- Java基础复习:泛型
- java基础11 泛型
- 基础---java 泛型
- java基础<泛型>
- 淘宝双飞翼布局,两边固定中间自适应布局。中间内容先显示。
- 51单片机汇编语言编程:开关控制计时
- 读取xml文件的值 字符串的截取
- 数码管显示 0-9999计数器
- 用51单片机汇编语言设计程序,实现一个4位秒表
- java基础篇--06<java泛型>
- 用51单片机汇编语言,写一个60s倒计时的程序
- 用51单片机汇编语言,编写“键控加减一”的程序
- iOS集成环信昵称和头像(自己服务器)
- ZOJ 1016 Parencodings *^*
- 用C51语言设计程序,实现0~99秒计数器
- 数学建模Word排版——题注、尾注、交叉引用
- 用80x86汇编语言编程:分类统计字符个数
- 基于51单片机的99-00倒计时秒表