java泛型学习(2)

一:深入泛型使用。主要是父类和子类存在泛型的demo

/**
 * 父类为泛型类
* @author 尚晓飞
* @date 2014-7-15 下午7:31:25
*
*
* 父类和子类的泛型。
* 【泛型的具体声明】
* (1)子类直接声明具体类型
* (2)使用时指定具体类型(new 对象时)
* (3)子类泛型>=父类泛型(个数,类型,顺序无关)
*
* 【泛型的确定】
* (1)属性:在父类中,泛型随父类泛型而定
*            子类中,泛型随子类泛型而定
* (2)重写方法中:
*         泛型全部随父类而定
* 【泛型的擦除】
* 父类和子类泛型要么同时擦除。统一object对待
* 子类不能擦除泛型,而父类存在泛型
*
*
* @param <T>
 */
public abstract  class Father<T,T1> {
    T name;
    public abstract T test(T t);
}

//子类声明时指定具体类型
//属性类型为具体类型
class Child1 extends Father<String,Integer>{

    @Override//重写方法中,泛型全部随父类而定
    public String test(String t) {
        // TODO Auto-generated method stub
        return null;
    }

}

//子类为泛型类.类型在使用时确定(new 对象时)
//子类类型>=父类类型
class Child2<T1,T,T2> extends Father<T,T1>{
    @Override
    public T test(T t) {
        // TODO Auto-generated method stub
        return null;
    }
}

//子类为泛型类,父类不指定泛型,统一object对待,父类泛型的擦除
//子类和父类同时擦除泛型。
//子类不能单独擦除泛型,而父类不擦除泛型
class Child3<T1,T> extends Father{
    T1 name2;//子类中属性,随子类泛型而定

    @Override
    public Object test(Object t) {
        // TODO Auto-generated method stub
        return null;
    }

}

//这是报错的,子类擦除,父类使用泛型。编译通不过。
class Child extends Father<T, T1>{

}

二:泛型的一个误区使用demo

Student泛型类

public class Student<T> {
    T javase;
    T oracle;

    public T addStudent(T t1){
        T sT=t1;
        return sT ;
    }

    public Student() {
        super();
    }
    public Student(T javase, T oracle) {
        super();
        this.javase = javase;
        this.oracle = oracle;
    }
    public T getJavase() {
        return javase;
    }
    public void setJavase(T javase) {
        this.javase = javase;
    }
    public T getOracle() {
        return oracle;
    }
    public void setOracle(T oracle) {
        this.oracle = oracle;
    }

}

测试Test类

泛型的擦除
 * 【1】子类继承|实现时不指定泛型
 * 【2】使用时不指定泛型
 *  统一Object对待,但泛型不是object,编译时不会类型检查
 *  编译器会发出警告,但不报错

 1 /**
 2  * 泛型的擦除
 3  * 【1】子类继承|实现时不指定泛型
 4  * 【2】使用时不指定泛型
 5  *  统一Object对待,但泛型不是object,编译时不会类型检查
 6  *  编译器会发出警告,但不报错
 7 * @author 尚晓飞
 8 * @date 2014-7-15 下午8:26:21
 9 *
10  */
11 public class Test {
12     public static void main(String[] args) {
13         Student stu1=new Student();//如果使用时不确定泛型类型,编译器会发出警告,但不算错;
14         Object sd=stu1.javase;//类型统一用object对待。相当于object,而不是指object
15
16         Student<Object> stu2=new Student<Object>();
17
18         test1(stu1);//虽然没确定泛型,以object对待,只是相当于,但不确定。泛型擦除,编译时编译器不会类型检查。所以不报错
19         test1(stu2);//如果泛型指定是Object时,那么传入的实参的泛型必须是Object.此方法报错。泛型一旦确定,哪怕是指定Object,编译器会编译类型检查
20
21         test2(stu1);
22         test2(stu2);
23
24     }
25
26     //方法一
27     public static void  test1(Student<Integer> st){}
28     //方法二
29     public static void test2(Student<?> st){}
30 }

d

java泛型学习(2)

时间: 2024-10-17 17:49:04

java泛型学习(2)的相关文章

java 泛型学习

http://blog.csdn.net/archie2010/article/details/6232228 学习集合框架的时候经常用hasmap<Integer,Integer>就是泛型,c++里面叫模板,其实我是想研究一下迭代器模式的.睡觉,明天再说. 1 import java.util.ArrayList; 2 import java.util.Collection; 3 4 class A< T extends Collection> 5 { 6 private T x

Java泛型学习笔记--Java泛型和C#泛型比较学习(一)

总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型区别的最大原因,后面会介绍).C#泛型在.NET CLR支持为.NET框架引入参数化变量支持.C#泛型更类似C++模板,可以理解,C#泛型实际上可以理解为类的模板类.我们通过代码实例来看C# 2.0泛型解决的问题,首先,我们通过一个没有泛型的迭代器的代码示例说起,代码实现如下: interface

Java泛型学习笔记 - (七)浅析泛型中通配符的使用

一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List<?>. 无边界的通配符的主要作用就是让泛型能够接受未知类型的数据. 2. 固定上边界的通配符(Upper Bounded Wildcards): 使用固定上边界的通配符的泛型, 就能够接受指定类及其子类类型的数据. 要声明使用该类通配符, 采用<? extends E>的形式, 这里的E就是

Java泛型学习

先引用一段Java编程思想中的一段话 Java泛型的核心概念:告诉编译器你想使用什么类型,然后编译器帮你处理一切细节. 关于类型推断: 类型推断只对赋值操作有效,其他时候并不起作用.如果你见过一个泛型方法调用的结果 作为参数传递给另一个方法,这时编译器不会执行类型推断.在这种情况下,编译器认为:调用泛型 方法后,其返回值被付给了一个Object变量.当然现在在Java8先已经可以了

Java泛型学习笔记 - (六)泛型的继承

在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: 1 Object obj = new Integer(10); 这其实就是面向对象编程中的is-a关系. 既然上面的代码正确, 那么在泛型中, 也可以使用如下代码: 1 public class Box<T> { 2 private T obj; 3 4 public Box() {} 5 6 public T getObj() { 7 return obj; 8 } 9 10 pub

java泛型学习和实践(4)

引言 前三节讲述了泛型常见声明及使用,泛型既可以在类上进行声明,也可以在单个方法上进行声明,并分别对这两种情况进行了总结.下面来学习下泛型扩展知识. 延用前面的Runnable接口.Buick类.Ford类.Driver类,新增加一个汽车容器类CarContainer 第一版 代码如下: public interface Runnable { public void run(); } public class Buick implements Runnable { @Override publi

Java泛型学习笔记 - (二)泛型类

1. 我们先写一个没有泛型的类Box: 1 public class Box { 2 3 private Object obj; 4 5 public Box() {} 6 7 public Object getObj() { 8 return obj; 9 } 10 11 public void setObj(Object obj) { 12 this.obj = obj; 13 } 14 15 public Box(Object obj) { 16 super(); 17 this.obj

Java泛型学习笔记 - (三)泛型方法

泛型方法其实和泛型类差不多, 就是把泛型定义在方法上, 格式大概就是: public <类型参数> 返回类型 方法名(泛型类型 变量名) {...}泛型方法又分为动态方法和静态方法,:1. 动态泛型方法其实在前一篇博文中我已经用到了, 1 public class Box<T> { 2 3 private T obj; 4 5 public Box() {} 6 7 public T getObj() { 8 return obj; 9 } 10 11 public void se

java泛型学习和实践(1)

引言 JDK1.5之后引入了泛型,泛型刚开始接触时比较难理解,经过慢慢学习,有一些收获,现总结下,既可以加深自身理解,也可以帮助他人. 由于本人水平有限,难免有不对的地方,还请指正.废话不多说,下面正式开始. 为了更直观的说明泛型,现假设一个司机开车的场景.我们需要3个类,Driver(司机).Ford(福特).Buick(别克). 第一版 第一版本代码如下: public class Buick { public void run(){ System.out.println("buick ru