Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限
泛型:
一种程序设计语言的新特性,于Java而言,在JDK 1.5开始引入。泛型就是在设计程序的时候定义一些可变部分,在具体使用的时候再给可变部分指定具体的类型。使用泛型比使用Object变量再进行强制类型转换具有更好的安全性和可读性。在Java中泛型主要体现在泛型类、泛型方法和泛型接口中。
泛型类:
当一个类要操作的引用数据类型不确定的时候,可以给该类定义一个形参。用到这个类的时候,通过传递类型参数的形式,来确定要操作的具体的对象类型。在JDK1.5之前,为了提高代码的通用性,通常把类型定义为所有类的父类型:Object,这样做有两大弊端:1. 在具体操作的时候要进行强制类型转换;2. 这样还是指定了类型,还是不灵活,对具体类型的方法未知且不安全。
泛型类的格式:在类名后面声明类型变量<E> ,泛型类可以有多个类型变量, 如:public class MyClass<K, V>
什么时候使用泛型类?
只要类中操作的引用数据类型不确定,就可以定义泛型类。通过使用泛型类,可以省去强制类型转换和类型转化异常的麻烦。
泛型类例子:
在这里定义两个类:Teacher 和 Student,定义一个泛型类Util<E>,其中getE()的作用是根据传入的对象,返回具体的对象。在main()方法中,传入具体的类型为Student和Teacher,再进一步操作。
- public class Generic {
- public static void main(String[] args) {
- Util<Student> ts = new Util<Student>();
- System.out.println(ts.getE(new Student("Student","三年级" ,22)).getGrade());
- Util<Teacher> tt = new Util<Teacher>();
- System.out.println(tt.getE(new Teacher("Teacher",22)).getName());
- }
- }
- class Util<E>{
- public E getE(E e){
- return e;
- }
- }
- class Teacher{
- String name;
- int age;
- public Teacher() {
- }
- public Teacher(String name, int age){
- this.name = name;
- this.age = age;
- }
- Some Getter & Setter functions
- }
- class Student{
- String name;
- String grade;
- int number;
- public Student(String name, String grade, int number){
- this.name = name;
- this.grade = grade;
- this.number = number;
- }
- Some Getter & Setter functions
- }
public class Generic {public static void main(String[] args) {
Util<Student> ts = new Util<Student>();
System.out.println(ts.getE(new Student("Student","三年级" ,22)).getGrade());
Util<Teacher> tt = new Util<Teacher>();
System.out.println(tt.getE(new Teacher("Teacher",22)).getName());}
}
class Util<E>{
public E getE(E e){
return e;
}
}class Teacher{
String name;
int age;
public Teacher() {
}public Teacher(String name, int age){
this.name = name;
this.age = age;
}
Some Getter & Setter functions
}
class Student{
String name;
String grade;
int number;
public Student(String name, String grade, int number){
this.name = name;
this.grade = grade;
this.number = number;
}
Some Getter & Setter functions
}
泛型方法:
泛型方法也是为了提高代码的重用性和程序安全性。编程原则:尽量设计泛型方法解决问题,如果设计泛型方法可以取代泛型整个类,应该采用泛型方法。
泛型方法的格式:类型变量放在修饰符后面和返回类型前面, 如:public static <E> E getMax(T... in)
泛型方法例子:
- public class GenericFunc {
- public static void main(String[] args) {
- print("hahaha");
- print(200);
- }
- public static <T> void print(T t){
- System.out.println(t.toString());
- }
- }
public class GenericFunc {public static void main(String[] args) {
print("hahaha");
print(200);
} public static <T> void print(T t){
System.out.println(t.toString());
}
}
泛型接口:
将泛型原理用于接口实现中,就是泛型接口。
泛型接口的格式:泛型接口格式类似于泛型类的格式,接口中的方法的格式类似于泛型方法的格式。
泛型接口例子:
MyInterface.java
- public interface MyInteface<T> {
- public T read(T t);
- }
public interface MyInteface<T> {
public T read(T t);
}
Generic2.java
- public class Generic2 implements MyInterface<String>{
- public static void main(String[] args) {
- Generic2 g = new Generic2();
- System.out.println(g.read("hahaha"));
- }
- @Override
- public String read(String str) {
- return str;
- }
- }
public class Generic2 implements MyInterface<String>{public static void main(String[] args) {
Generic2 g = new Generic2();
System.out.println(g.read("hahaha"));
} @Override
public String read(String str) {
return str;
}
}
泛型通配符:
当操作的不同容器中的类型都不确定的时候,而且使用的元素都是从Object类中继承的方法,这时泛型就用通配符“?”来表示。
泛型的通配符:“?” 相当于 “? extends Object”
泛型通配符例子:
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.HashSet;
- import java.util.Iterator;
- public class AllCollectionIterator {
- public static void main(String[] args) {
- HashSet<String> s1 = new HashSet<String>();
- s1.add("sss1");
- s1.add("sss2");
- s1.add("sss3");
- ArrayList<Integer> a1 = new ArrayList<Integer>();
- a1.add(1);
- a1.add(2);
- a1.add(3);
- a1.add(4);
- printAllCollection(a1);
- System.out.println("-------------");
- printAllCollection(s1);
- }
- public static void printAllCollection(Collection<?> c){
- Iterator<?> iter = c.iterator();
- while (iter.hasNext()) {
- System.out.println(iter.next().toString());
- }
- }
- }
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator; public class AllCollectionIterator {public static void main(String[] args) {
HashSet<String> s1 = new HashSet<String>();
s1.add("sss1");
s1.add("sss2");
s1.add("sss3"); ArrayList<Integer> a1 = new ArrayList<Integer>();
a1.add(1);
a1.add(2);
a1.add(3);
a1.add(4); printAllCollection(a1);
System.out.println("-------------");
printAllCollection(s1);
} public static void printAllCollection(Collection<?> c){
Iterator<?> iter = c.iterator();
while (iter.hasNext()) {
System.out.println(iter.next().toString()); }
}
}
泛型限定:
泛型限定就是对操作的数据类型限定在一个范围之内。限定分为上限和下限。
上限:? extends E 接收E类型或E的子类型
下限:? super E 接收E类型或E的父类型
限定用法和泛型方法,泛型类用法一样,在“<>”中表达即可。
一个类型变量或通配符可以有多个限定,多个限定用“&”分隔开,且限定中最多有一个类,可以有多个接口;如果有类限定,类限定必须放在限定列表的最前面。如:T extends MyClass1 & MyInterface1 & MyInterface2
在Collection<E>接口中addAll()就用到泛型限定。
addAll(Collection<?
extends E> c)
将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
泛型限定的例子:
这个例子的作用是计算最大值。
- import java.util.Calendar;
- import java.util.GregorianCalendar;
- public class GenericGetMax {
- public static void main(String[] args) {
- String[] inArrStr = {"haha", "test", "nba", "basketball"};
- System.out.println(GetMax.findMax(inArrStr).toString());
- Integer[] inArrInt = {11, 33, 2, 100, 101};
- System.out.println(GetMax.findMax(inArrInt));
- GregorianCalendar[] inArrCal = {
- new GregorianCalendar(2016, Calendar.SEPTEMBER, 22),
- new GregorianCalendar(2016, Calendar.OCTOBER, 10)};
- System.out.println(GetMax.findMax(inArrCal).toZonedDateTime());
- }
- }
- class GetMax {
- @SafeVarargs
- public static <T extends Comparable> T findMax(T... in) {
- T max = in[0];
- for (T one : in) {
- if (one.compareTo(max) > 0) {
- max = one;
- }
- }
- return max;
- }
- }
import java.util.Calendar;
import java.util.GregorianCalendar; public class GenericGetMax {public static void main(String[] args) {
String[] inArrStr = {"haha", "test", "nba", "basketball"};
System.out.println(GetMax.findMax(inArrStr).toString());
Integer[] inArrInt = {11, 33, 2, 100, 101};
System.out.println(GetMax.findMax(inArrInt));
GregorianCalendar[] inArrCal = {
new GregorianCalendar(2016, Calendar.SEPTEMBER, 22),
new GregorianCalendar(2016, Calendar.OCTOBER, 10)};
System.out.println(GetMax.findMax(inArrCal).toZonedDateTime());
}
}
class GetMax {
@SafeVarargs
public static <T extends Comparable> T findMax(T... in) {
T max = in[0];
for (T one : in) {
if (one.compareTo(max) > 0) {
max = one;
}
}return max;
}
}
Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限的更多相关文章
- java 泛型 -- 泛型类,泛型接口,泛型方法
泛型T泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束.在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数.形式类型参数与实际类型参数之间的关系类似于形式方 ...
- Java 基础 - 泛型类/泛型方法/类型通配符'?' 的用法及栗子
笔记: /**1.定义一个PairTest泛型类, 测试泛型 类 Pair的用法 * class Pair<T>{ * private T first; * private T secon ...
- java泛型-泛型类,泛型接口,常用形式
泛型简单使用: package com.etc; import java.util.ArrayList; import java.util.List; /* 泛型就相当于<>一个标签,泛化 ...
- Java泛型解析(02):通配符限定
Java泛型解析(02):通配符限定 考虑一个这种场景.计算数组中的最大元素. [code01] public class ArrayUtil { public static <T&g ...
- Java 泛型示例 - 泛型方法,类,接口
Java Genrics 是 Java 5 中引入的最重要的功能之一. 如果您一直在使用Java Collections并使用版本 5 或更高版本,那么我确定您已经使用过它. Java 中具有集合类的 ...
- java泛型-自定义泛型方法与类型推断总结
下面是自定义泛型方法的练习: package com.mari.generic; import java.util.ArrayList; import java.util.Collection; im ...
- Java泛型之上、下界通配符的理解(适合初学)
泛型的由来 为什么需要泛型 Java的数据类型一般都是在定义时就需要确定,这种强制的好处就是类型安全,不会出现像弄一个ClassCastException的数据给jvm,数据安全那么执行的clas ...
- JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)
一.通配符上限和通配符下限接受的类型 通配符上限:<? extends T> 通配符下限:<? super T> 以下代码是测试结果,注释为解释说明 package xayd. ...
- Java泛型(2):泛型接口
泛型不仅可以在类上实现,也可以在接口上实现.JDK中[Iterable<T> <-- Collection<E> <-- List<E>/Queue&l ...
随机推荐
- EBS OAF开发中实体对象和视图对象的属性设置器
EBS OAF开发中实体对象和视图对象的属性设置器 (版权声明.本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 源文: Home > Oracle ...
- 负载均衡(LB)具体解释
二.LB LoadBalance就是把负载均衡分配到集群的各个节点,从而提高总体的吞吐能力.Oracle 10g RAC提供了两种手段来实现负载,其一是通过Connection Balancing.依 ...
- 图解hdu5301Buildings
这个题就是给出一个大矩形n*m.当中有个1*1的小格子不能被占用,然后要你用非常多小矩形去填满.问小矩形的最小最大面积是多少. 显然小矩形必定是1*x的最好,毕竟i*x,若i>1则还是能够拆成非 ...
- linux的vi或vim文件时,怎样消除刚才查找字符串的高亮?
有时候,自己在通过/查找字符串时,会出现: 但是呢,当你保存,再次进入还是会出现这么花的高亮显示,很令人苦恼. 解决办法 随便,输入没有的字符串,即可解决. 如下 /sssssssssssssssss ...
- 基于Linux平台的Openvas配置使用视频教学
常见的漏洞扫描工具有Openvas.LSAT.Nessus.X-scan.ShadowSecurityScanner和流光等,openvas是一款最全面的开源漏洞扫描工具,由于openvas安装比较困 ...
- 虚拟局域网(VLAN)技术在企业网管理中的应用
虚拟局域网(VLAN)技术在企业网管理中的应用 1.VLAN介绍 所谓VLAN 是指处于不同物理位置的节点根据需要组成不同的逻辑子网,即一个VLAN 就是一个逻辑广播域,它可以覆盖多个网络设备 ...
- linux操作指令:
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- 【bzoj4864】神秘物质
Description 给出一个长度为n的序列,第i个数为ai,进行以下四种操作: merge x e:将当前第x个数和第x+1个数合并,得到一个新的数e: insert x e:在当前第x个数和第x ...
- LuoguP3254 圆桌问题(最大流)
题目描述 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,……,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,……,n)个代表就餐. ...
- 如何在win10上同时安装python2和python3
哎,其实本人已经用惯了python2,听说python3的语法有很多不一样的地方,那我之前写的算法改起来岂不是日了狗了吗?所以一直没改用python3.但是谷歌的那个TensorFlow,在windo ...