java从基础知识(八)泛型
1、什么是泛型?
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
package com.classTest.generic;
public class GenericOrdination {
    public static void main(String[] args) {
        Box<String> box = new Box<String>("STR");
        User user = new User();
        user.setName("user");
        user.setAge(12);
        Box<User> box1 = new Box<User>(user);
        System.out.println(box.getClass() == box1.getClass());//true
    }
}
class Box<T> {
    private T data;
    public Box() {
    }
    public Box(T data) {
        this.data = data;
    }
    public T getData() {
        return data;
    }
}
class User {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
上述结构是因为在编译期间,所有的泛型信息都会被擦除,List<String>和List<User>类型,在编译后都会变成List类型(原始类型)。Java中的泛型基本上都是在编译器这个层次来实现的,这也是Java的泛型被称为“伪泛型”的原因。
4、泛型类和方法(Java总结篇系列:Java泛型)
public class GenericTest {
    public static void main(String[] args) {
        Box<String> box = new Box<String>("corn");
        System.out.println("name:" + box.getData());
        User user = new User();
        user.setAge(1);
        user.setName("sun");
        Box<User> box1 = new Box<User>(user);
        System.out.println(box1.getData().toString());
    }
}
5、类型通配符(用?标识)
public class GenericTest {
    public static void main(String[] args) {
        Box<String> box = new Box<String>("corn");
        User user = new User();
        user.setAge(1);
        user.setName("sun");
        Box<User> box1 = new Box<User>(user);
        getData(box);
        getData(box1);
    }
    public static void getData(Box<?> data) {
        System.out.println("data :" + data.getData());
    }
}
7、类型通配符上限和类型通配符下限(通过extends关键字实现)
public class GenericTest {
    public static void main(String[] args) {
        Box<Integer> box = new Box<Integer>(123);
        Box<Long> box1 = new Box<Long>(123l);
        getData(box);
        getData(box1);
    }
    public static void getData(Box<? extends Number> data) {
        System.out.println("data :" + data.getData());
    }
}
Box<? extends Number>将传递参数类型限制为Number类或其子类,如果泛型类型为String或User等就会报编译错误,这样就达到了对泛型的有效限制。
java从基础知识(八)泛型的更多相关文章
- Java 多线程——基础知识
		java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ... 
- java必备基础知识(一)
		学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ... 
- 什么才是java的基础知识?
		近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ... 
- java部分基础知识整理----百度脑图版
		近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ... 
- Java 多线程基础(八)线程让步
		Java 多线程基础(八)线程让步 yield 一.yield 介绍 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权:但是,并 ... 
- JAVA相关基础知识
		JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ... 
- JAVA学习基础知识总结(原创)
		(未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ... 
- Java虚拟机基础知识
		写在前面 之前老大让做一些外包面试,我的问题很简单: 介绍一下工作中解决过比较有意思的问题. HashMap使用中需要注意的点. 第一个问题主要是想了解一下对方项目经验的含金量,第二个问题则是测试下是 ... 
- Java SE基础知识
		Java SE面试题 目录 Java SE基础 基本语法 数据类型 关键字 面向对象 集合 集合类概述 Collection接口 List Set Map Java SE基础 基本语法 数据类型 Ja ... 
随机推荐
- [LeetCode] Nested List Weight Sum II 嵌套链表权重和之二
			Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ... 
- git初级--配置
			source: http://www.cnblogs.com/sakurayeah/p/5800424.html 一.注册github账号 github网址https://github.com/ 下一 ... 
- hadoop配置
			配置参考博客:(目前有问题,百度说官网的是32bit,现在正在尝试64位 http://www.powerxing.com/install-hadoop-cluster/ 
- 使用 win+r 命令行打开我们的桌面应用(处女座的福音)
			首先新建一个文件夹,名为quickapp,然后在地址栏复制文件目录地址,进入系统高级设置,修改系统环境变量Path,双击后选择新建,输入quickapp文件目录地址,确认保存. 如何修改path变量? ... 
- 高通vuforia+Unity3D 制作ar app
			很简单就可以用Unity3D做出增强现实的一个小例子 新人第一次写博客,若出现错误望指正^_^ 需要下载de东西: unity3d 5.0 http://unity3d.com/get-unity ... 
- Xcode 运行程序,左侧memory 不显示内存
			运行程序后,xcode 不显示当前使用的内存情况,问题是打开了僵尸--enable zoombie Objects,关闭即可 打开 product--->SCheme-->EditSChe ... 
- word中公式居中标号没有右对齐
			打开视图-标尺,调整右侧标尺就行了. 
- Python 【第八章】:JavaScript 、Dom、jQuery
			JavaScript 放置位置 body内部最下面,这样可以避免javascript链接失效时,长时间加载不到页面html内容 变量: var a =123 局部变量 a = 123 全局变量 作用域 ... 
- struts-hibernate-ajax完成区县和街道级联下拉框功能(二补充使用json解析list结果集,ajax循环json层级处理)
			针对<struts-hibernate-ajax完成区县和街道级联下拉框功能>进行补充,上一篇中,要在action中拼接JSON格式字符串,很容易手抖.直接用json处理一下转成json格 ... 
- AnjularJS系列3 —— 数据的双向绑定
			第三篇,双向的数据绑定 数据绑定是AnguarJS的特性之一,避免书写大量的初始代码从而节约开发时间 数据绑定指令提供了你的Model投射到view的方法.这些投射可以无缝的,毫不影响的应用到web应 ... 
