泛型:

      jdk1.5出现的安全机制

好处:

  1.将运行时期的问题ClassCastException转到了编译时期。

  2.避免了强制转换的麻烦。

<>:

   什么时候用?

      当操作的引用数据类型不确定的时候,就使用<>。将要操作的引用数据类型传入即可。

      其实<>就是一个用于接收具体引用数据类型的参数范围。

   在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型。

泛型技术是给编译器使用的技术,用于编译时期。确保了类型的安全。

运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除

  为什么要擦除呢?  为了兼容运行的类加载器。

泛型的补偿: 在运行时,通过获取元素的类型进行转换动作。不用 使用者 在强制转换了。

泛型的通配符: ? 未知类型

泛型的限定:

  ? extends E:接受E类型或E的子类型对象。上限一般存储对象的时候用。比如,添加元素 addAll        boolean  addAll(<? extends E> c)

  ? super E    :接受E类型或E的父类型对象。下限,一般取出对象的时候用。比如比较器。          TreeSet(Comparator<? super E> comparator)

泛型例子:

 import java.util.ArrayList;
import java.util.Iterator; public class GenericDemo { public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>(); //强制转化 al.add("abc");
al.add("hahah");
// al.add(123); //会报错 Iterator<String> it = al.iterator(); //强制转化 while (it.hasNext())
{
String str = it.next(); //不用强制转化了
System.out.println(str);
} } }

Comparator,Comparable的泛型

 package p2;

 public class Person implements Comparable<Person> {
private String name;
private int age; public Person(){
super();
} public Person(String name, int age)
{
super();
this.name = name;
this.age = age;
} @Override
public int compareTo(Person o) {
// Person p = (Person)obj; //不用强制转化了
int temp = this.age - o.age; return temp==0?this.name.compareTo(o.name):temp;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} /* (非 Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} /* (非 Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} /* (非 Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} } package p3; import java.util.Comparator; import p2.Person; public class ComparatorByName implements Comparator<Person> { @Override
public int compare(Person o1, Person o2) {
int temp = o1.getName().compareTo(o2.getName()); return temp==0? o1.getAge()-o2.getAge() : temp;
} } import java.util.Iterator;
import java.util.TreeSet; import p2.Person;
import p3.ComparatorByName; public class GenericDemo2 { public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<Person>(new ComparatorByName()); ts.add(new Person("sfsf",21));
ts.add(new Person("fdg",14));
ts.add(new Person("erw",18));
ts.add(new Person("iu",30)); Iterator<Person> it = ts.iterator(); while(it.hasNext())
{
Person p = it.next(); System.out.println(p);
} } }

类和方法上的泛型

 public class Tool<QQ> {
private QQ q; public QQ getObject() {
return q;
} public void setObject(QQ object) {
this.q = object;
} /*
* 将泛型定义在方法上
*
* */ public <W> void show(W str)
{
System.out.println(str.toString());
} public void print(QQ str)
{
System.out.println(str); //如果写str.length(); 是错误的; 因为不知道泛型QQ究竟是什么具体类型,所以不能使用具体类型的方法。
//不过可以使用Object的方法
} /*
* 当方法静态时,不能访问类上定义的泛型。
* 如果静态方法使用泛型,只能将泛型定义在方法上。
* 泛型一定要放在返回值类型的前面,修饰符的后面
*
* */
public static <Y> void method(Y obj)
{
System.out.println(obj);
} }

【Java学习笔记】泛型的更多相关文章

  1. Java学习笔记--泛型

    一个泛型类就是具有一个或者多个类型变量的类. 我们可以只关注泛型,而不会为数据存储的细节而烦恼 . java泛型(一).泛型的基本介绍和使用 http://blog.csdn.net/lonelyro ...

  2. Java学习笔记——泛型

    假定T不仅要指定接口的类继承.使用下面的方式: public class some<T extends Iterable<T> & Comparable<T>&g ...

  3. Thinking in Java学习笔记-泛型和类型安全的容器

    示例: public class Apple { private static long counter; private final long id = counter++; public long ...

  4. Java 学习笔记 泛型

    泛型 上界匹配 ? extends Number 下界匹配 ? super Number getSimpleName 不包括包名 getName 会包括包名 常和反射联合使用,做框架 Type是一个标 ...

  5. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  6. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  7. java学习笔记08--泛型

    java学习笔记08--泛型 泛型可以解决数据类型的安全性问题,它主要的原理,是在类声明的时候通过一个标识标识类中某个属性的类型或者是某个方法的返回值及参数类型.这样在类声明或实例化的时候只要指定好需 ...

  8. java学习笔记10--枚举

    java学习笔记10--枚举 在JDK1.5之前,java可以有两种方式定义新类型:类和接口.对于大部分面向对 象编程来说,这两种方法看起来似乎足够了,但是在一些特殊情况下,这些方法就不适合.例如,想 ...

  9. java学习笔记10--泛型总结

    java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5-- ...

  10. 20145230《java学习笔记》第九周学习总结

    20145230 <Java程序设计>第9周学习总结 教材学习内容 JDBC JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作, ...

随机推荐

  1. Linux下*.tar.gz文件解压缩命令

    1.压缩命令: 命令格式:tar  -zcvf   压缩文件名.tar.gz   被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解压缩命令: 命令格式:tar  -z ...

  2. mybatis中当实体类的字段名和表结构中的字段名不一致的时候的处理

    1.在sql语句中使用列的别名 比如:select order_id id,orderNo orderno ,order_price price from order where order_id = ...

  3. postgresql数据类型转换

    PostgreSQL数据类型转换需要使用语法 alter table tbname alter column fieldname type date_type 遇到需要转换为特殊类型如DATE.BOO ...

  4. nginx 日志分割

    利用 crontab + shell 来实现nginx的 access log 按天切割,便于统计.具体实现如下: shell: #! /bin/sh NGINX_DIR=/data/apps/ngi ...

  5. Linux下find命令

    转自:http://www.cnblogs.com/skynet/archive/2010/12/25/1916873.html 1.1.find命令的一般形式 man文档中给出的find命令的一般形 ...

  6. Python函数中的参数(二)

    当使用混合特定的参数匹配模型时,Python将会遵循以下有关顺序的法则: 1.在函数调用中,参数必须以这样的顺序出现:任何位置参数(Value).任何关键字参数(name = Value)和*sequ ...

  7. 第五百七十八、九天 how can I 坚持

    这样下去不行啊 ,昨天晚上回来捣鼓了一晚上手机,看个视频还经常开小差,得全力以赴了,不能抱着打酱油的心态了,加油. 今天和yj聊了聊,好多事啊,不能一心工作了,还得考虑结婚,也是醉了. 努力吧,先把考 ...

  8. 在MS SQLSERVER中如何最快的速度清空所有用户表的数据

    有时候我们需要清空数据库中所有用户表的数据,如果一张表一张表的清空的话,遇到一个庞大的数据系统估计得崩溃了.  用游标加上用变量来引用表名就可以做到这一点. 用变量来引用表名对表操作可以用在存储过程中 ...

  9. flex4.0密钥及破解方式

    输入下面的序列号: 1424-4507-0757-7016-8907-6937 1424-4785-4428-8084-6314-8733 1424-4794-9281-8063-2338-9079 ...

  10. NLPP-02-Exercises

    <PYTHON自然语言处理>第2章 内容简介:各种文本语料库. 古腾堡项目 www.gutenberg.org OLAC元数据格式档 http://www.language-archive ...