Java泛型的应用
一、泛型类
package generics;
/**
* 泛型类,格式:public class 类名<泛型类型1, ...>
* @author zhongfg
* @date 2015-06-16
* @param <T>
*/
class Student<T> { private T num; public T getNum() {
return num;
} public void setNum(T num) {
this.num = num;
} } public class GenericsClass {
public static void main(String[] args) { Student<String> s1 = new Student<String>();
s1.setNum("001");
String num1 = s1.getNum();
System.out.println(num1); System.out.println("----------------"); Student<Integer> s2 = new Student<Integer>();
s2.setNum(2);
int num2 = s2.getNum();
System.out.println(num2);
}
}
二、泛型方法
package generics;
/**
* 泛型方法,public <泛型类型> 返回值 方法名(泛型类型)
* @author zhongfg
* @date 2015-06-16
*/
class Actor { public <T> void show(T t){ System.out.println(t);
} } public class GenericsMethod { public static void main(String[] args) { Actor a = new Actor();
a.show("Angelababy");
a.show(26);
}
}
三、泛型接口
package generics;
/**
* 泛型类,格式:public interface 接口名<泛型类型1, ...>
* @author zhongfg
* @date 2015-06-16
* @param <T>
*/
interface Person<T> { public abstract void show(T t);
} class PersonImpl<T> implements Person<T> { @Override
public void show(T t) {
// TODO Auto-generated method stub
System.out.println(t);
}
} public class GenericsInterface {
public static void main(String[] args) { Person<String> p1 = new PersonImpl<String>();
p1.show("黄晓明"); Person<Integer> p2 = new PersonImpl<Integer>();
p2.show(38);
}
}
四、泛型高级之通配符
package generics; import java.util.ArrayList;
import java.util.Collection; /**
* 泛型高级(通配符)
* ?:任意类型,如果没有明确指定,那么就是Object或者任意的Java类了
* ? extends E:向下限定,E及其子类
* ? super E:向上限定,E及其父类
* @author zhongfg
* @date 2015-06-16
*/
class Animal { } class Dog extends Animal { } class Cat extends Animal { } public class GenericsWildcard {
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>(); 报错,Object不是Animal子类
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>(); 报错,Dog不是Animal及其以上的类型
// Collection<? super Animal> c16 = new ArrayList<Cat>(); 同上
}
}
Java泛型的应用的更多相关文章
- Java泛型的历史
为什么Java泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...
- 浅析Java 泛型
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
- Java:泛型基础
泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...
- java泛型基础
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类.接口和方法的创建中, 分别称为泛型类.泛型接口.泛型方法. Ja ...
- 使用java泛型设计通用方法
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...
- 关于Java泛型的使用
在目前我遇到的java项目中,泛型应用的最多的就属集合了.当要从数据库取出多个对象或者说是多条记录时,往往都要使用集合,那么为什么这么使用,或者使用时有什么要注意的地方,请关注以下内容. 感谢Wind ...
- 初识java泛型
1 协变数组类型(covariant array type) 数组的协变性: if A IS-A B then A[] IS-A B[] 也就是说,java中的数组兼容,一个类型的数组兼容他的子类类型 ...
- 【Java心得总结四】Java泛型下——万恶的擦除
一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...
- 【Java心得总结三】Java泛型上——初识泛型
一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...
- 初识Java泛型以及桥接方法
泛型的由来 在编写程序时,可能会有这样的需求:容器类,比如java中常见的list等.为了使容器可以保存多种类型的数据,需要编写多种容器类,每一个容器类中规定好了可以操作的数据类型.此时可能会有Int ...
随机推荐
- ASIHTTPRequest框架使用总结系列之阿堂教程4(下载数据)
从本篇开始,阿堂准备进一步介绍ASIHTTPRequest框架下载数据和上传数据的实际应用. 为了实现多线程并发请求网络能力,ASIHTTPRequest被设计成 NSOperation ...
- Node.js 使用jQuery取得Nodejs http服务端返回的JSON对象示例
server.js代码: // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http" ...
- Windows服务器SYSTEM权限Webshell无法添加3389账户情况突破总结
转自:http://bbs.blackbap.org/thread-2331-1-1.html 近好多Silic的朋友在Windows下SYSTEM权限的php webshell下添加账户,但是却无法 ...
- es6 webpack转es5
更新时间: 2018-7-31 首次更新. 先生成package.json npm init -y 再安装以下npm插件 npm i babel-core babel-loader babel-pre ...
- javascript 模块引擎 (手写草稿)
1.试题: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 我是怎样理解web页面的
事实上web页面包括三部分东东 1.页面展示的元素(HTML) 2.页面元素展示的样式(CSS) 3.控制页面元素的交互(JavaScript) 不管页面多么复杂,从这三方面去看,都会得到清晰的认识的 ...
- 【SpringMVC学习04】Spring、MyBatis和SpringMVC的整合
前两篇springmvc的文章中都没有和mybatis整合,都是使用静态数据来模拟的,但是springmvc开发不可能不整合mybatis,另外mybatis和spring的整合我之前学习mybati ...
- 获取 Android 版本
var a = /Android(.+?);/.exec(window.navigator.userAgent) if (a) { this.AndroidVersion = +(a[1].trim( ...
- laravel数据库——迁移
1.简介 迁移就像数据库的版本控制,允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和Laravel的结构构建器结对从而可以很容易地构建应用的数据库表结构. Laravel的Schema门面提 ...
- macbook 下SDK Manager 的更新[即使Google被屏蔽了也无所谓]
废话少说,直接说操作步骤: 1. 改动/etc/hosts文件: 右键单击Finder,选择前往目录,输入/private/etc/,敲回车键.将文件/etc/hosts复制到桌面(由于权限受限.无法 ...