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 ...
随机推荐
- 使用rsync在windows(服务端)与linux(客户端)之间同步
说明: 1.cwRsyncServer服务端 系统:Windows7 IP地址:192.168.0.110 2.Rsync客户端 系统:CentOS 6.7 IP地址:192.168.0.141 实现 ...
- Python中编码的详细讲解
看这篇文章前,你应该已经知道了为什么有编码,以及编码的种类情况 ASCII 占1个字节,只支持英文 GB2312 占2个字节,支持6700+汉字 GBK GB2312的升级版,支持21000+汉字 S ...
- Python中生成器和迭代器的功能介绍
生成器和迭代器的功能介绍 1. 生成器(generator) 1. 赋值生成器 1. 创建 方法:x = (variable for variable in iterable) 例如:x = (i f ...
- 安装yum源和gcc编译器遇到的问题
这两天我试着在VMware虚拟机里安装gcc,遇到了不少问题 1. 安装yum源 我搭建的是光盘yum源(有两种方法搭建yum源,另外一种是网络yum源,但至今没弄懂我的网络yum源为什么不成功) ...
- TensorFlow-Bitcoin-Robot:Tensorflow 比特币交易机器人
简介 一个比特币交易机器人基于 Tensorflow LSTM 模型,仅供娱乐. A Bitcoin trade robot based on Tensorflow LSTM model.Just f ...
- PowerBI 第九篇:修改查询
在PowerBI的查询编辑器中,用户可以使用M语言修改Query,或修改Query字段的类型,或向Query中添加数据列(Column),对Query进行修改会导致PowerBI相应地更新数据模型(D ...
- idea热部署
<!-- 热部署模块 --> <dependency> <groupId>org.springframework.boot</groupId> < ...
- 学习sharding-jdbc 分库分表扩展框架
先丢代码地址 https://gitee.com/a247292980/sharding-jdbc 再丢pom.xml的dependency <properties> <projec ...
- 216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- ScalaPB(1): using protobuf in akka
任何类型的实例作为消息在两端独立系统的机器之间进行传递时必须经过序列化/反序列化serialize/deserialize处理过程.假设以下场景:在一个网络里有两台连接的服务器,它们分别部署了独立的a ...