Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类
泛型:jdk1.5后的新特性,用于解决安全问题,是一个安全机制。
好处:
1.将运行时的异常出现问题classcastException。转移到了编译时期。方便程序员调试解决问题,让运行事情问题减少,安全。
2.避免了强制转换
泛型格式:通过<>来定义要操作的引用数据类型。
在使用Java中,什么时候使用泛型呢?
通常在集合框架中很常见,只要见到<>就要定义泛型,其实<>就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
如同函数传参数一样。
Comparator<>是一个接口,也可以带泛型,表示指定类型。
//泛型类
什么时候定义泛型类呢?
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。
class Utils<QQ>{ private QQ q; public void setObject(QQ q){ this.q=q; } public QQ getObject(){ return q; } } class Tool{ private Object obj; public void setObject(Object obj){ this.obj=obj; } public Object getObject(){ return obj; } } class GenericDemo3{ public static void main(String [] args){ Utils<Worker> u=new Utils<Worker>(); u.setObject(new Worker()); Worker w=(Worker) u.getObject(); /*Tool t=new Tool(); t.setObject(new getWorker()); Worker w=(Worker)t.getObject(); */ } }
/*
特
*/
泛型方法:
class Demo<T>{//操作对象一建立,对象就固定,这是泛型一个局限性。 public void show(T t){ System.out.println("show:"+t); } public void print(T t){ System.out.println("print"+t); } }
泛型类定义的泛型,在整个类中有效,如果被方法使用。那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已结固定了。
class Demo{ public <T> void show(T t){ System.out.println("show:"+t); } public <Q> void print(Q q){ //指定任意类型 System.out.println("print"+q); } public static <W> void method(W t){//静态方法泛型,是在static方法 System.out.println("method:"+t); } } class GenericDemo4{ public static void main(String [] args){ /*Demo<Integer> d=new Demo<Integer>(); d.show(new Integer(4)); d.print(9)*/ /*Demo d=new Demo(); d.show("haha"); d.show("new Integer(4)");*/ Demo<String> d=new Demo<Strring>(); d.show(4); d.print(5); d.print("lishi"); Demo.method("hahaha"); } }
泛型定义在接口上。
interface Inter<T>{ void show(T t); } //这个是指定String类型的。 class InterImp1 implements Inter<String>{ public void show(String t){ System.out.println("show:"+t); } } //这个是让操作者自己去指定类型的 class GenericDemo5{ public static void main(String[] args){ InterImp1 <Integer>=new InterImp1 <Integer>(); i.show(4); } } class GenericDemo5(){ public static void main(){ InterImp1 i=new InterImp1(); i.show("haha"); } }
? 通配符,也可以理解为占位符
泛型的限定:(高级应用)
?extend E:可以接收E类型或者E的子类,上限
? super E:可以接收E类型或E的父类型。下限
class GenericDemo6{ public static void main(String [] args){ ArrayList<String> al=new ArrayList<String>(); a1.add("abc1"); a1.add("abc2"); a1.add("abc3"); ArrayList<Person> al=new ArrayList<Person>(); a1.add(new Person("abc1")); a1.add(new Person("abc2")); a1.add(new Person("abc3")); /* ArrayList<Integer> all=new ArrayList<Integer>(); all.add(4); all.add(7); all.add(1); printColl(all);*/ //泛型限定 ArrayList<Student> all=new ArrayList<student>(); all.add(new Student("abc--1")); all.add(new Student("abc--2")); all.add(new Student("abc3--")); print(all); } public static void printColl(ArrayList<? extends Person>){ //? extends Person表示泛型限定。只能是继承person类及person本身的类。 Iterator<? extends Person> it=al.iterator(); while(it.hasNext()){ System.out.println(it.next().getName()); }
} /* public static void printColl(ArrayList<?> al){//当类型不知道时,我们可以用通配符?来表示 Iterator<?> it=al.iterator(); while(it.hasNext()){ System.out.println(it.next());//这里不能调用getlength().因为这是具体类中的方法,不能使用类型具体方法。但是可以使用toString() } }*/ }
泛型什么用呢?
答:指定具体类型,用<>,凡是<>里面的都能打印。但是只能某一个,
如果用通配符?表示能接收所有的类型
import java.util.*; class GenericDemo7 { public static void main(String[] args) { TreeSet<Student> ts = new TreeSet<Student>(new Comp()); ts.add(new Student("abc03")); ts.add(new Student("abc02")); ts.add(new Student("abc06")); ts.add(new Student("abc01")); Iterator<Student> it = ts.iterator(); while(it.hasNext()) { System.out.println(it.next().getName()); } /**/ TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp()); ts1.add(new Worker("wabc--03")); ts1.add(new Worker("wabc--02")); ts1.add(new Worker("wabc--06")); ts1.add(new Worker("wabc--01")); Iterator<Worker> it1 = ts1.iterator(); while(it1.hasNext()) { System.out.println(it1.next().getName()); } } } /* class StuComp implements Comparator<Student> { public int compare(Student s1,Student s2) { return s1.getName().compareTo(s2.getName()); } } class WorkerComp implements Comparator<Worker> { public int compare(Worker s1,Worker s2) { return s1.getName().compareTo(s2.getName()); } } */ class Comp implements Comparator<Person>//比较器。 { public int compare(Person p1,Person p2) { return p2.getName().compareTo(p1.getName());//里面只能用父类的方法。 } } class Person { private String name; Person(String name) { this.name = name; } public String getName() { return name; } public String toString() { return "person :"+name; } } class Student extends Person { Student(String name) { super(name); } } class Worker extends Person { Worker(String name) { super(name); } }
Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类的更多相关文章
- Java基础--说集合框架
版权所有,转载注明出处. 1,Java中,集合是什么?为什么会出现? 根据数学的定义,集合是一个元素或多个元素的构成,即集合一个装有元素的容器. Java中已经有数组这一装有元素的容器,为什么还要新建 ...
- Thinking in java基础之集合框架(转载)
集合简介(容器)把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成一个东西(一个对象),然后我们借用袋子把这20个苹果装起来,而这个袋子就是集合(也叫 ...
- java基础之集合框架
6.集合框架: (1)为什么出现集合类? 面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储. 集合就是存储对象最常用的一种方式. (2)数组和集合都是容器,两者有何不同 ...
- 黑马程序员——【Java基础】——集合框架
---------- android培训.java培训.期待与您交流! ---------- 一.集合框架概述 (一)集合框架中集合类关系简化图 (二)为什么出现集合类? 面向对象语言对事物的体现都是 ...
- java基础之集合框架--使用ArrayList类动态 存储数据
一.ArrayList是List接口下的一个实现类,实现了长度可变的.连续的数组:拥有数组的特性. 遵循了LIst的规则:不唯一的.有序的. 如果没有增加泛型的话,集合中可以添加任何类型的数据. 使用 ...
- java基础37 集合框架工具类Collections和数组操作工具类Arrays
一.集合框架工具类:Collections 1.1.Collections类的特点 该工具类中所有的方法都是静态的 1.2.Collections类的常用方法 binarySearch(List< ...
- Java基础之集合框架(Collection接口和List接口)
首先我们说说集合有什么作用. 一.集合的作用 1.在类的内部,对数据进行组织: 2.简单而快速的搜索大数量的条目: 3.有的集合接口,提供一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关 ...
- Java基础之集合框架类及泛型简介
Collection接口 Collection 通用的常见方法 add()添加一个元素,可以指定脚标 addAll()将一个collection放入 clear()清除 remove()删除元素,返回 ...
- Java基础之集合框架——使用集合Vector<>挑选演员(TryVector)
控制台程序. public class Person implements Comparable<Person> { // Constructor public Person(String ...
- Java基础之集合框架——使用堆栈Stack<>对象模拟发牌(TryDeal)
控制台程序. public enum Rank { TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, A ...
随机推荐
- C++中compile与build的区别
我在前面的博文就提到了GCC编译器工作的四个阶段:预处理.编译.汇编.链接. 感兴趣的同学可以参考:http://www.cnblogs.com/mlgjb/p/7708007.html compil ...
- 《Java技术》第一次作业——Java语言基础
学习总结 Scanner类实现基本数据输入的方法 Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配.然后可以使用不同的 next 方法将得到的标记转换为不同类型的值. ...
- python中decode
这 是因为遇到了非法字符--尤其是在某些用C/C++编写的程序中,全角空格往往有多种不同的实现方式,比如\xa3\xa0,或者\xa4\x57,这些 字符,看起来都是全角空格,但它们并不是" ...
- Jenkins简明入门(三) -- Blue Ocean,让一切变得简单
我们在上一节Jenkins简明入门(二) 中见识到了Jenkins能做些什么:利用Jenkins完成python程序的build.test.deployment. 同时,也有一种简单的方法,不需要写J ...
- Windows下设置 ssh key,配置GitHub ssh key
1.新建一个目录,利用git工具打开 Git Bash Here 2.执行如下命令 ssh-keygen -t rsa -C "email@email.com" 其中邮箱为GitH ...
- SQL Server数据库账号密码变更后导致vCenter Server无法访问数据库
SQL Server数据库账号密码变更后导致vCenter Server无法访问数据库 1.1状况描述: 若SQL Server数据库的账号(这里以sa为例)密码发生了变更,那么连接数据的客户端vCe ...
- js时间比较,获取n天后(前)的日期
<html> <head> <meta http-equiv="Content-Type" content="textml; charset ...
- css文本强制一行 字间距
white-space:nowrap 在一行 .slideLastlyNews img{margin-left:9px;margin-right:5px;margin-top:6px;width:5p ...
- BlockingQueue阻塞队列(解决多线程中数据安全问题 可用于抢票,秒杀)
案例:一个线程类中 private static BlockingQueue<Map<String, String>> dataQueue = new LinkedBlocki ...
- 【转载】给想要入门渗透的人的忠告——schiz0wcingU
最近发现很多拥有黑客梦想的年轻人在群里或者论坛里,找"师傅"或者学一些所谓的"社工" 这些找师傅的人当中,有极大一部分人是还在上学的学生,自然也就没有收入来源, ...