自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用

Posted 豆子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用相关的知识,希望对你有一定的参考价值。

  • 通配符

  • T, K, V, E 等泛型字母为有类型, 类型参数赋予具体的值

  • ? 未知类型 类型参数赋予不确定值, 任意类型

  • 只能用在 声明类型上,方法参数上, 不能用在定义泛型类上

  • 上限 extends, 指定类型必须是继承某个子类. 或者实现某个接口

    (不是用 implements), 即 <= 如

    ? extends Fruit

    ? extends List

  • 不能添加信息

  • 存在以下规则, 如

    List<Fruit> 满足 List<? extends Fruit>

    List<? extends Apple> 满足 List<? extends Fruit>

  • 下限 supper >=

  • 泛型嵌套

  • 泛型没有多态

  • 实例1 (通配符)

package cn.Douzi.Test03;

import java.util.ArrayList;
import java.util.List;

/*
 * ? --> 通配符,类型不确定, 用于声明变量  | 形参上
 * 不能用在
 * 1. 创建对象
 * 2. 创建泛型类  泛型方法  泛型接口上
 * 
 */
public class WildcardsTest {
    public static void main(String[] args) {
        //声明
        List<?> list = new ArrayList<Integer>();
        list = new ArrayList<String>();
        list = new ArrayList<Object>();
        test(list);
        
        //编译错误, 不能创建对象
//        list = new ArrayList<?>();
        
    }
    
    public static void test(List<?> list) {
        
    }
    
    //不能用在泛型方法上
    /*public static void test3(List<?> list) {
    }*/
    
    class Test<T> {
        
    }
    
    /* ? 不能创建泛型类上
    class Test2<?> {
    }*/
}
  • 实例2 (extends 上限)

package cn.Douzi.Test03;

import java.util.ArrayList;
import java.util.List;

/*
 * extends : 泛型的上限  <= 即子类
 * 1. 一般用于  限制操作
 * 2. 不能使用在添加数据上面    一般都是读取操作
 * 3. 规则
 *       List<Fruit> ---> List<? extends Fruit>
 *       List<Apple> ---> List<? extends Fruit>
 *       List<? extends Apple> --> List<? extends Fruit>
 *    不能存放
 *    List<?>
 *    List<? extends Object>
 * 
 */
public class ExtendsTest {
    public static void main(String[] args) {
        //extends 为上限
        Test<Fruit> t1 = new Test<Fruit>();
        Test<Apple> t2 = new Test<Apple>();
        Test<Pear> t3 = new Test<Pear>();
        
        //调用方法
        List<? extends Fruit> list1 = new ArrayList<Fruit>();
        test(list1);
        
        List<Fruit> list2 = new ArrayList<Fruit>();
        test(list2);
        
        List<Apple> list3 = new ArrayList<Apple>();
        test(list3);
        
        // ? extends Apple
        List<? extends Apple> list4 = new ArrayList<FujiApple>();
        test(list4);
        
        //? --> 为什么错误,因为 ? 等同于 ? extends Object
        List<?> list5 = new ArrayList<Object>();
        List<? extends Object> list6 = new ArrayList<Object>();
//        test(list5);
//        test(list6);
        
        List<FujiApple> app = new ArrayList<FujiApple>();
        test(app);
    }
    
    // ? extends Fruit
    public static void test(List<? extends Fruit> list) {
        //不能添加对象
//        list.add(new Apple());
//        list.add(new FujiApple());
        
        list.add(null);
    }
    
    //泛型类
    static class Test<T> extends Fruit {
        
    }
}
  • 实例(下限)

package cn.Douzi.Test03;

import java.util.ArrayList;
import java.util.List;

/***
 * supper : 泛型的下限 >= 即父类或自身
 * 1. 一般用于  下限制操作
 * 2. 能够添加数据    一般都是都是   子对象和自己,  不能添加父对象
 * 3. 规则
 *       List<Fruit> ---> List<? supper Fruit>
 *       List<Apple> ---> List<? super Fruit>
 *       List<? Fruit> --> List<? super Fruit>
 *    不能存放
 *    List<?>
 *    List<? super FujiApple> --> List<? super Apple>
 *
 */
public class Supper {
    public static void main(String[] args) {
        List<Apple> apple = new ArrayList<Apple>();
        test(apple);
        
        List<Fruit> list2 =  new ArrayList<Fruit>();
        test(list2);
        
        List<Object> list3 = new ArrayList<Object>();
        test(list3);
        
        //规则
        List<? super Apple> list4 = new ArrayList<Apple>();
        test(list4);
        
        List<? super Fruit> list5 = new ArrayList<Object>();
        test(list5);
        
        //编译错误
//        List<? super FujiApple> list6 = new ArrayList<FujiApple>();
//        test(list6);
        
//        List<?> list7 = new ArrayList<Object>();
//        test(list7);
        
        
    }
    
    public static void test(List<? super Apple> list) {
        //不能添加父类信息
        //
        list.add(new Apple());
        list.add(new FujiApple());
//        list.add(new Fruit());
    }
}
  • 实例(泛型嵌套)

package cn.Douzi.Test03;

import java.util.Map.Entry;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/***
 * 泛型嵌套 --> 由外到内拆分
 * @author Administrator
 *
 */

public class StudentApp {
    public static void main(String[] args) {
        
        Student<String> stu = new Student<String>();
        
        stu.setScore("优秀");
        System.out.println(stu.getScore());
        
        Douzi<Student<String>> douzi = new Douzi<Student<String>>();
        douzi.setStu(stu);
        
        stu = douzi.getStu();
        String score = stu.getScore();
        System.out.println(score);
        
        //HashMap
        Map<String, String> map = new HashMap<String, String>();
        
        map.put("a", "Douzi");
        map.put("b", "DouDou");
        
        Set<Entry<String,String>> entrySet = map.entrySet();
        //增强for循环
        for (Entry<String, String> entry : entrySet) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "-->" + value);
        }
        
    }
}
  • 实例(泛型没有多态)

package cn.Douzi.Test03;

import java.util.ArrayList;
import java.util.List;

/***
 * 1. 泛型没有多态
 * 2. 泛型没有数组
 * @author Douzi
 * 
 */
public class Polymorphism {
    
    public static void main(String[] args) {
        //多态
        Fruit f = new Apple();
        //泛型没有多态
//        List<Fruit> list = new ArrayList<Apple>();
        List<? extends Fruit> list = new ArrayList<Apple>();
        
        //没有泛型数组
//        Fruit<String>[] arr = new Fruit<String>[100];
//        Fruit[] arr = new Fruit[100];  //可以
        
        //JDK1.7 泛型简化
        List<Fruit> list2 = new ArrayList<>();
        
    }    
}
  • 总结

1. 通配符 ? --> 类型不定, 声明变量上
2. 上限 extends <= 不能添加信息
   下限 super   >= 不能添加父信息
3. 泛型嵌套, 由外到内获取即可
4. 泛型没有多态, 泛型没有数组
5. jdk1.7泛型简化, 创建对象不用指定类型

 

以上是关于自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用的主要内容,如果未能解决你的问题,请参考以下文章

Java_泛型笔记

JAVA泛型_泛型类接口通配符方法上下边界

JAVA基础_自定义泛型

我的学习之路_第六章_迭代器,泛型

JavaSE——泛型自定义泛型泛型通配符上下限

JAVASE(十五) 泛型 :泛型用例自定义泛型类通配符