泛型:

      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 DMZ host 允许虚拟机以Host-only的方式上网

    linux DMZ host 允许虚拟机以Host-only的方式上网. host ip 192.168.0.17 vboxnet0 ip 192.168.56.1 1.首先打开linux的转发功能: ...

  2. 堆block和栈block的区分

    0. 问题所在 下面给出一段代码: - (NSArray*) getBlockArray { int num = 916; return [[NSArray alloc] initWithObject ...

  3. 让finder显示路径

    在控制台输入 defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES 重启finder即可.

  4. Laxcus大数据管理系统单机集群版

    Laxcus大数据管理系统是我们Laxcus大数据实验室历时5年,全体系全功能设计研发的大数据产品,目前的最新版本是2.1版本.从三年前的1.0版本开始,Laxcus大数据系统投入到多个大数据和云计算 ...

  5. myeclipse搭建SSH框架

    搭建SSH框架 Struts+hibernater+spring架构(myeclipse) 右击,首先加入spring,加入hibernater,再加入struts2 复制jar包(把tomcat发布 ...

  6. activeamq启动失败

    启动activeamq,启动时控制台显示: INFO: Using java '/usr/bin/java'INFO: Starting - inspect logfiles specified in ...

  7. java.lang.UnsupportedClassVersionError

    尝试运行出错,出错原因:/tmp/tmp_1458557049226652 exit 1, Exception in thread "main" java.lang.Unsuppo ...

  8. 127.0.0.1和localhost完全相等吗?

    今天在使用ajax发请求的时候遇到如下问题: 以[Access-Control-Allow-Origin]为关键字搜索的结果进行改进,但没有效果. 返回仔细查看错误提示,发现ajax请求的url是lo ...

  9. BASE64 官方方法,我自己用的,注意记住换行问题。

    TBase64Encoding.Base64.Encode(str) TBase64Encoding.Base64.Decode(str) 注意如果str很长,base64后的结果是每76个字符自动加 ...

  10. iptables转发

    需求 将流入服务器的公网IP的80端口的流量全部转发到另一个公网IP(1.2.3.4)的80端口上. 操作 iptables -P FORWARD ACCEPT iptables -t nat -A ...