自定义泛型_无多态_通配符无泛型数组_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泛型简化, 创建对象不用指定类型
时间: 2024-08-25 18:34:06

自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用的相关文章

java中的泛型【T】与通配符【?】概念入门

使用泛型的目的是利用Java编译机制,在编译过程中帮我们检测代码中不规范的有可能导致程序错误的代码.例如,我们都知道List容器可以持有任何类型的数据,所以我们可以把String和Integer等类型同时放入同一个List容器中,但是这种做法是极其危险的.在泛型机制中,这种操作就会导致编译不通过,会强制要求你将List容器中的数据类型修改为统一类型.这种机制可以帮助我们减少程序运行中隐藏的Bug. 泛型[T] 泛型在代码中使用广泛. 泛型的用法 根据泛型使用的位置,即使用在类(Class),属性

Spring_MVC_教程_快速入门_深入分析

Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明

C# WinForm 拖动无边框窗体 改变无边框窗体尺寸

经常遇到这种情况.窗体的边框去掉了.然后种种问题就出来了:不能拖动.不能改变窗体大小.不能......当然.肯定有解决方案滴*^_^*今天的目标就是:可以直接拖动没有边框的窗体.可以直接拉拽窗体改变其大小.制作步骤如下:新建WinForm程序.添加一个启动的窗体.将其边框设置为None.进入代码编辑界面.定义如下常量值: const int Guying_HTLEFT = 10; const int Guying_HTRIGHT = 11; const int Guying_HTTOP = 12

系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构

系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这个实体有关联关系. 3,每个实体中都有什么属性? 1,主键.推荐使用代理主键 2,关联关系属性.在类图中,关联关系是一条线,有两端,每一端对应一个表达此关联关系的属性.有几个端指向本类,本类中就有几个关联关系属性. 3,一般属性.分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等.

权限模块_使用权限_实现主页面的效果_显示左侧菜单&amp;只显示有权限的菜单项

权限模块__使用权限__实现主页面的效果 HomeAction.java public class HomeAction extends ActionSupport { public String index() { return "index"; } public String top() { return "top"; } public String bottom() { return "bottom"; } public String le

C++_练习—继承_公有继承

公有继承 公有继承 public: 当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中  不变,而基类的私有成员不可访问. 即基类的公有成员和保护成员被继承到派生类中仍作为派生类的公有成员和保护成员.派生类的其他成员可以直接访问它们.无  论派生类的成员还是派生类的对象都无法访问基类的私有成员. 公有继承:当公有继承时,基类的公有变成派生类的公有,保护变成派生类的保护,私有不可以直接被派生类访问,可通过公有和保护间接访问! 1 #include <iostream> 2

机器学习_深度学习_入门经典(永久免费报名学习)

机器学习_深度学习_入门经典(博主永久免费教学视频系列) https://study.163.com/course/courseMain.htm?courseId=1006390023&share=2&shareId=400000000398149 作者座右铭---- 与其被人工智能代替,不如主动设计机器为我们服务. 长期以来机器学习很多教材描述晦涩难懂,大量专业术语和数学公式让学生望而止步.生活中机器学习就在我们身边,谷歌,百度,Facebook,今日头条都运用大量机器学习算法,实现智能

用花生壳实现内网映射,决解无域名、无公网IP、无服务器空间问题

无域名.无公网IP.无服务器空间用花生壳提供的免费内网映射吧.你的PC就是服务器,花生壳提供的自定义二级域名轻松访问你的个人网站. 1.首先你得注册哦,然后申请免费的而已域名(2个) 2.设置路由器,下面以TP-Link-WR847N 为例 (如果登录不成功,可能是你使用了客户端并绑定了内网映射,删除映射在登录即可) 3.设置端口映射 80和8080 端口外网都无法访问进来,应该网络运营商有限制. 4.开启防火墙 5.建个站点试试,IP:192.168.129  端口:668 6.效果 都是成功

3_Jsp标签_简单标签_防盗链和转义标签的实现

一概念 1防盗链 在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件,通过referer,网站可以检测目标网页访问的来源网页.有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面. 2页面中的转义字符 在HTML中,定义转义字符串的原因有两个:第一个原因是像“<”和“>”这类符号已经用来表示HTML标签,因此就不能直接当作文本中的符号来使用.为了在HTML文档中使用这些符号,就