A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fanfuhu1992 中级黑马   /  2016-3-16 22:54  /  321 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1泛型应用
  早期的时候,我们使用Object来代表任意的类型。
  向上转型是没有任何问题的,但是在向下转型的时候其实隐含了类型转换的问题。
  也就是说这样的程序其实并不是安全的。所以Java在JDK5后引入了泛型,提高程序的安全性。

package cn.itcast_03;
public class ObjectTool {
        private Object obj;
        public Object getObj() {
                return obj;
        }
        public void setObj(Object obj) {    // Object obj = new Integer(30);
                this.obj = obj;
        }
}

package cn.itcast_03;
public class ObjectToolDemo {
        public static void main(String[] args) {
                ObjectTool ot = new ObjectTool();

                // 正常使用
                ot.setObj(new Integer(27));
                Integer i = (Integer) ot.getObj();
                System.out.println("年龄是:" + i);

                ot.setObj(new String("林青霞"));
                String s = (String) ot.getObj();
                System.out.println("姓名是:" + s);

                System.out.println("---------");
                ot.setObj(new Integer(30));
                // ClassCastException
                String ss = (String) ot.getObj();
                System.out.println("姓名是:" + ss);
        }
}

1.泛型类
泛型类:把泛型定义在类上
类名后面加泛型<T>
创建对象的时候确定类型

定义一个泛型类:
package cn.itcast_04;
public class ObjectTool<T> {       //<T>可以放任意的字母,其实就相当于是个参数,需要什么放什么
        private T obj;               //其实就是一个可以应用的时候自己去定义的可变类型,在定义类的时候先在类名后面加一个<T>符号,然后这个类里面就可以不去给变量、返回值、参数等去定义类型了,如果哪些变量、返回值、参数等是统一的类型就可以都定义成<T>符号
        public T getObj() {         
                return obj;
        }
        public void setObj(T obj) {
                this.obj = obj;
        }
}                          

泛型类的测试
package cn.itcast_04;
public class ObjectToolDemo {
        public static void main(String[] args) {
                // ObjectTool ot = new ObjectTool();

                // ot.setObj(new String("林青霞"));        //如果不定义泛型,需要的是一个Object类的对象我可以传一个子类String类型的对象
                // // ClassCastException
                // Integer ii = (Integer) ot.getObj();        //但是接收的时候如果不小心用别的类型去接      收了,但是它在编译的时候并不会报错,因为这个对象实际是String类的对象但是表现得是Object类型的,     那么将Object类型强转为别的其他非String类型的类型也是符合语法判断的,所以编译不报错,那么等到执行报错就比较麻烦了,所以引进了泛型。
                // System.out.println("姓名是:" + ii);

                System.out.println("-------------");

                ObjectTool<String> ot = new ObjectTool<String>();
                // ot.setObj(new Integer(27)); //这个时候编译期间就过不去
                ot.setObj(new String("林青霞"));
                String s = ot.getObj();
                System.out.println("姓名是:" + s);

                ObjectTool<Integer> ot2 = new ObjectTool<Integer>();
                // ot2.setObj(new String("风清扬"));//这个时候编译期间就过不去
                ot2.setObj(new Integer(27));
                Integer i = ot2.getObj();
                System.out.println("年龄是:" + i);
        }
}

2.泛型方法
泛型方法:把泛型定义在方法上
调用方法的时候确定类型
在返回值前加泛型<T>

定义一个泛型方法:
public class ObjectTool {
        public <T> void show(T t) {
                System.out.println(t);
        }
}

泛型方法的测试:
package cn.itcast_05;
public class ObjectToolDemo {
        public static void main(String[] args) {
                // 定义泛型方法后
                ObjectTool ot = new ObjectTool();
                ot.show("hello");
                ot.show(100);
                ot.show(true);
        }
}

3.泛型接口
泛型接口:把泛型定义在接口上(其实又回到了泛型类)
在接口名后面加泛型<T>

定义一个泛型类:
package cn.itcast_06;
public interface Inter<T> {
        public abstract void show(T t);
}

//实现类(即接口的子类)在实现接口:
//第一种情况:已经知道该是什么类型的了
//public class InterImpl implements Inter<String> {
//        @Override
//        public void show(String t) {
//                System.out.println(t);
//        }
// }
//第二种情况:还不知道是什么类型的
public class InterImpl<T> implements Inter<T> {
        @Override
        public void show(T t) {
                System.out.println(t);
        }
}

泛型接口测试:
package cn.itcast_06;
public class InterDemo {
        public static void main(String[] args) {
                // 第一种情况的测试
                // Inter<String> i = new InterImpl();
                // i.show("hello");
                // // 第二种情况的测试
                Inter<String> i = new InterImpl<String>();
                i.show("hello");
                Inter<Integer> ii = new InterImpl<Integer>();
                ii.show(100);
        }
}

2.泛型高级(通配符)
泛型如果明确的写的时候,前后必须一致
泛型高级(通配符)
?:任意类型,如果没有明确,那么就是Object以及任意的Java类了
? extends E:向下限定,E及其子类
? super E:向上限定,E极其父类

package cn.itcast_07;
import java.util.ArrayList;
import java.util.Collection;
public class GenericDemo {
        public static void main(String[] args) {
                // 泛型如果明确的写的时候,前后必须一致
                Collection<Object> c1 = new ArrayList<Object>();
                // Collection<Object> c2 = new ArrayList<Animal>();
                // Collection<Object> c3 = new ArrayList<Dog>();
                // Collection<Object> c4 = new ArrayList<Cat>();

                // ?表示任意的类型都是可以的
                Collection<?> c5 = new ArrayList<Object>();
                Collection<?> c6 = new ArrayList<Animal>();
                Collection<?> c7 = new ArrayList<Dog>();
                Collection<?> c8 = new ArrayList<Cat>();

                // ? extends E:向下限定,E及其子类
                // Collection<? extends Animal> c9 = new ArrayList<Object>();     //报错
                Collection<? extends Animal> c10 = new ArrayList<Animal>();
                Collection<? extends Animal> c11 = new ArrayList<Dog>();
                Collection<? extends Animal> c12 = new ArrayList<Cat>();

                // ? super E:向上限定,E极其父类
                Collection<? super Animal> c13 = new ArrayList<Object>();
                Collection<? super Animal> c14 = new ArrayList<Animal>();
                // Collection<? super Animal> c15 = new ArrayList<Dog>();      //报错
                // Collection<? super Animal> c16 = new ArrayList<Cat>();       //报错
        }
}

class Animal {
}

class Dog extends Animal {
}

class Cat extends Animal {
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马