java基础篇5之泛型

news/2024/7/3 6:51:03

1 泛型的基本应用

//反射方式 指定类型,就不用强转
Construcctor<String> constructor = String.class.getConstructor(Stringbuffer.class);

泛型是提供给javac编译器使用的,可以限定集合输入的类型,
编译器编译带类型说明的集合时,会除掉类型信息,
返回的数据类型不用强转


2 泛型的内部原理和更深应用

ArrayList<Integer> collection1 = new ArrayList<Integer>();
collection1.getClass().getMethod("add",Objec.class).invoke(collection1,"abc");
collection1.get(0);//abc

泛型是给编译器看的
例子:
ArrayList<E> E称为参数类型或类型参数

泛型里面参数不要考虑父子关系
Collecion<Object>!= Collection<Integer>


3 泛型的通配符?

Collection<?>
使用?通配符可以引用其他参数化的类型,?通配符定义的
变量主要用作引用,可以调用与参数化无关的方法,不能调用与
参数化有关的方法。

泛型中的?通配符的扩展
限定通配符的上边界:
Vector<? extends Number> x = new Vector<Integer>();
限定通配符的下边界:
Vector<? super Integer> x = new Vector<NUmber>();

限定通配符总是包括自身

HashMap<String,Integer> maps = new HashMap<String,Integer>();
maps.put("zxx",28);
maps.put("lhm",35);
maps.put("flx",35);

Set<Map.Entry<String,Intger>> entrySet = maps.entrySet();
for(Map.Entry<String,Intger> entry:entrySet){
entry.getKey()+":"+entry.getValue();
}

 

4 自定义泛型方法及应用

  swap(new String[]{"abc","dw","dsf"},1,2)

    public static <T> void swap(T[] a,int i,int j){
        T tmp = a[i];
        a[i] =a[j];
        a[j] = tmp;
    }

    Object obj ="abc";
    String x2= autoConvert(obj);

    private static <T> T autoConvert(Object obj){
        return (T)obj;
    }

    private static <T>  fillArray(T[] a, T obj){
        for(int i=0;i<a.length;i++){
            a[i] = obj;
        }
    }

泛型的应用在返回值之前用<T> 来表示
然后在实际应用中根据实际类型值进行参数应用

 

类泛型

public class GenericDao<E>{
        public <E> void add(E x){
        }

        public  E findById(int id){
            return null;
        }

        public void delete(E obj){
        }

        public void update(E obj){
        }

        public Set<E> findByConditions(String where){
            return null;
        }
    }

    GenericDao<ReflectPoint> dao - new GenericDao<ReflectPoint>();
    dao.add(new ReflectPoint(3,3));

 

静态方法不能用类的泛型


5 通过反射获取泛型实际类型参数
编译完成之后去类型化

   Method applyMethod = GenericTest.class.getMethod("applyVector",Vector.class);
    Type[] types = applyMethod.getGenericParameterTypes();    
    ParameterizeType pType = (ParameterizeType)Types[0];
    pType.getRawType();
    pType.getActualTypeArguments()[0];

    public static void applyVector(Vector<Date> v1){

    }

 

转载于:https://www.cnblogs.com/atomicbomb/p/6624316.html


http://www.niftyadmin.cn/n/2087925.html

相关文章

vue缓存之keep-alive,设置想要缓存的页面

结合router&#xff0c;缓存部分页面 <keep-alive><router-view v-if"$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if"!$route.meta.keepAlive"></router-view> {path: /,name: Hello,compo…

Vue.js 2.2 卡片api

给vue开发者和爱好者发送点福利&#xff01; 卡片上一共117个api&#xff0c;方便查阅 网址: https://vuejs-tips.github.io/cheatsheet Github: https://github.com/vuejs-tips/cheatsheet PDF: https://vuejs-tips.github.io/cheatsheet/vuejs-cheatsheet.pdf 原文地址&#…

linux 编译mqtt静态库_Linux动态库和静态库教程

本教程以Ubuntu16.04系统为例&#xff0c;实验涉及的程序文件有&#xff1a;xyhcal.c&#xff0c;add.c&#xff0c;sub.c&#xff0c;mul.c&#xff0c;xyhcal.h&#xff0c;这五个文件的源代码如图1所示&#xff1a;图1 源代码示意图Linux动态库具体实现步骤如下&#xff1a;…

android贪吃蛇项目代码_如何用C语言做贪吃蛇小游戏?

C语言作为计算机编程最初学的语言&#xff0c;作为高级语言的C语言&#xff0c;那么它又可以为我们实现什么功能呢&#xff1f;我认为有强大的基础技能和无限的脑洞&#xff0c;你就可以做出许多我们意想不到的程序出来&#xff0c;关键在于你是否敢想敢做&#xff1f;下面我就…

WASND6.1官方不支持SUSE 10.3,我手工让它自检通过支持项

编辑一个maintenance.xml文件&#xff0c;文件内容如下&#xff1a; − <install-package> − <nif-cache id"nifcache" impl"com.ibm.ws.install.ni.framework.plugin.NIFCachePlugin"> <param name"cacheid" value"primar…

mysql中查询没有选修某两门课的_关于MySQL的经典例题50道

--1.学生表Student(S,Sname,Sage,Ssex) --S 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表Course(C,Cname,T) --C --课程编号,Cname 课程名称,T 教师编号--3.教师表Teacher(T,Tname) --T 教师编号,Tname 教师姓名--4.成绩表SC(S,C,score) --S 学生编号,C 课程…

1.7.10:简单密码

10:简单密码 查看提交统计提问总时间限制: 1000ms内存限制: 65536kB描述Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符&#xff0c;将它用它字母表中后5位对应的字符来代替&#xff0c;这样就得到了密文。比如字符A用F来代替。如下是密文和明文中字符的对应关…

Eclipse安装和使用TFS

第一步下载Tfs插件 去微软官网下载https://www.microsoft.com/en-us/download/details.aspx?id4240 点击 选择下载 随便放置到一个本地或者服务器目录(不带中文) 第二步建立站点 下载完毕之后&#xff0c;打开Eclipse。 点击Help菜单中的Install New Software选项。 点击添加…