泛型:

一种程序设计语言的新特性,于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,再进一步操作。

  1. public class Generic {
  2. public static void main(String[] args) {
  3. Util<Student> ts = new Util<Student>();
  4. System.out.println(ts.getE(new Student("Student","三年级" ,22)).getGrade());
  5. Util<Teacher> tt = new Util<Teacher>();
  6. System.out.println(tt.getE(new Teacher("Teacher",22)).getName());
  7. }
  8. }
  9. class Util<E>{
  10. public E getE(E e){
  11. return e;
  12. }
  13. }
  14. class Teacher{
  15. String name;
  16. int age;
  17. public Teacher() {
  18. }
  19. public Teacher(String name, int age){
  20. this.name = name;
  21. this.age = age;
  22. }
  23. Some  Getter & Setter functions
  24. }
  25. class Student{
  26. String name;
  27. String grade;
  28. int number;
  29. public Student(String name, String grade, int number){
  30. this.name = name;
  31. this.grade = grade;
  32. this.number = number;
  33. }
  34. Some Getter & Setter functions
  35. }
public class Generic {
public static void main(String[] args) {
Util&lt;Student&gt; ts = new Util&lt;Student&gt;();

        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 &amp; 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)

泛型方法例子:

  1. public class GenericFunc {
  2. public static void main(String[] args) {
  3. print("hahaha");
  4. print(200);
  5. }
  6. public static <T> void print(T t){
  7. System.out.println(t.toString());
  8. }
  9. }
public class GenericFunc {
public static void main(String[] args) {
print("hahaha");
print(200);
} public static &lt;T&gt; void print(T t){
System.out.println(t.toString());
}

}

泛型接口:

将泛型原理用于接口实现中,就是泛型接口。

泛型接口的格式:泛型接口格式类似于泛型类的格式,接口中的方法的格式类似于泛型方法的格式。

泛型接口例子:

MyInterface.java

  1. public interface MyInteface<T> {
  2. public T read(T t);
  3. }
public interface MyInteface<T> {
public T read(T t);
}

Generic2.java

  1. public class Generic2 implements MyInterface<String>{
  2. public static void main(String[] args) {
  3. Generic2 g = new Generic2();
  4. System.out.println(g.read("hahaha"));
  5. }
  6. @Override
  7. public String read(String str) {
  8. return str;
  9. }
  10. }
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”

泛型通配符例子:

  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.HashSet;
  4. import java.util.Iterator;
  5. public class AllCollectionIterator {
  6. public static void main(String[] args) {
  7. HashSet<String> s1 = new HashSet<String>();
  8. s1.add("sss1");
  9. s1.add("sss2");
  10. s1.add("sss3");
  11. ArrayList<Integer> a1 = new ArrayList<Integer>();
  12. a1.add(1);
  13. a1.add(2);
  14. a1.add(3);
  15. a1.add(4);
  16. printAllCollection(a1);
  17. System.out.println("-------------");
  18. printAllCollection(s1);
  19. }
  20. public static void printAllCollection(Collection<?> c){
  21. Iterator<?> iter = c.iterator();
  22. while (iter.hasNext()) {
  23. System.out.println(iter.next().toString());
  24. }
  25. }
  26. }
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&lt;String&gt; s1 = new HashSet&lt;String&gt;();
s1.add("sss1");
s1.add("sss2");
s1.add("sss3"); ArrayList&lt;Integer&gt; a1 = new ArrayList&lt;Integer&gt;();
a1.add(1);
a1.add(2);
a1.add(3);
a1.add(4); printAllCollection(a1);
System.out.println("-------------");
printAllCollection(s1);
} public static void printAllCollection(Collection&lt;?&gt; c){
Iterator&lt;?&gt; 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 中(可选操作)。

泛型限定的例子:

这个例子的作用是计算最大值。

  1. import java.util.Calendar;
  2. import java.util.GregorianCalendar;
  3. public class GenericGetMax {
  4. public static void main(String[] args) {
  5. String[] inArrStr = {"haha", "test", "nba", "basketball"};
  6. System.out.println(GetMax.findMax(inArrStr).toString());
  7. Integer[] inArrInt = {11, 33, 2, 100, 101};
  8. System.out.println(GetMax.findMax(inArrInt));
  9. GregorianCalendar[] inArrCal = {
  10. new GregorianCalendar(2016, Calendar.SEPTEMBER, 22),
  11. new GregorianCalendar(2016, Calendar.OCTOBER, 10)};
  12. System.out.println(GetMax.findMax(inArrCal).toZonedDateTime());
  13. }
  14. }
  15. class GetMax {
  16. @SafeVarargs
  17. public static <T extends Comparable> T findMax(T... in) {
  18. T max = in[0];
  19. for (T one : in) {
  20. if (one.compareTo(max) > 0) {
  21. max = one;
  22. }
  23. }
  24. return max;
  25. }
  26. }
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 泛型-泛型类、泛型方法、泛型接口、通配符、上下限的更多相关文章

  1. java 泛型 -- 泛型类,泛型接口,泛型方法

    泛型T泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束.在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数.形式类型参数与实际类型参数之间的关系类似于形式方 ...

  2. Java 基础 - 泛型类/泛型方法/类型通配符'?' 的用法及栗子

    笔记: /**1.定义一个PairTest泛型类, 测试泛型 类 Pair的用法 * class Pair<T>{ * private T first; * private T secon ...

  3. java泛型-泛型类,泛型接口,常用形式

    泛型简单使用: package com.etc; import java.util.ArrayList; import java.util.List; /* 泛型就相当于<>一个标签,泛化 ...

  4. Java泛型解析(02):通配符限定

    Java泛型解析(02):通配符限定      考虑一个这种场景.计算数组中的最大元素. [code01] public class ArrayUtil { public static <T&g ...

  5. Java 泛型示例 - 泛型方法,类,接口

    Java Genrics 是 Java 5 中引入的最重要的功能之一. 如果您一直在使用Java Collections并使用版本 5 或更高版本,那么我确定您已经使用过它. Java 中具有集合类的 ...

  6. java泛型-自定义泛型方法与类型推断总结

    下面是自定义泛型方法的练习: package com.mari.generic; import java.util.ArrayList; import java.util.Collection; im ...

  7. Java泛型之上、下界通配符的理解(适合初学)

    泛型的由来 为什么需要泛型   Java的数据类型一般都是在定义时就需要确定,这种强制的好处就是类型安全,不会出现像弄一个ClassCastException的数据给jvm,数据安全那么执行的clas ...

  8. JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)

    一.通配符上限和通配符下限接受的类型 通配符上限:<? extends T> 通配符下限:<? super T> 以下代码是测试结果,注释为解释说明 package xayd. ...

  9. Java泛型(2):泛型接口

    泛型不仅可以在类上实现,也可以在接口上实现.JDK中[Iterable<T> <-- Collection<E> <-- List<E>/Queue&l ...

随机推荐

  1. HDU 2846 Repository (字典树 后缀建树)

    Repository Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  2. MongoDB + node-mongoskin简单演示样例

    特点 无模式 MongoDB 中的每一条文档,都是一个 JSON 对象,因此你无需提前定义一个集合的结构,集合中的每一个文档也能够有不同的结构. 异步写入 MongoDB 默认全部的写操作都是『不安全 ...

  3. 一步一步跟我学hadoop(1)----hadoop概述和安装配置

    这几年云计算大数据非常火,借这个东风.今天開始学习apache的分布式计算框架hadoop,希望不要太落后. Hadoop说明 对于hadoop.apache官方wiki给出的说明为 Apache H ...

  4. actionMode-theme中修改actionmode中more下拉框的背景颜色

    今天在做图库修改是,需要修改图库的actionbar某个按钮弹出来的下拉框的背景颜色,在网上找了个方法尝试下,没有打到自己的要求,不过阴差阳错的却修改了more下拉框的背景,再次记录下,也许以后能用的 ...

  5. UICollectionView——整体总结

    前言 这几天有时间看了下UICollectionView的东西,才发觉它真的非常强大,很有必要好好学习学习.以前虽然用过几次,但没有系统的整理总结过.这两天我为UICollectionView做一个比 ...

  6. Android全局退出的两种方法

    第一种方法参考<第一行代码>78页 建立一个ActivityCollector类,提供静态方法addActivity,fininshAll(以list为容器) 然后我们建立的Activit ...

  7. python Tricks —— list 镜像复制与 list comprehension 列表解析的顺序

    0. 对 list 镜像复制,a = [1, 2, 3] ⇒ [1, 2, 3, 3, 2, 1] a*2 ⇒ a = [1, 2, 3, 1, 2, 3] a.extend(reversed(a)) ...

  8. c# for 和 foreach

    1给定长度 不需要计算长度的 for比foreach循环效率高 2 在不确定长度 或者计算长度有性能损耗的时候 用foreach比较方便 2336 循环语句是编程的基本语句,在C#中除了沿用C语言的循 ...

  9. VS Code 终端显示问题

    一.打开编辑器的终端时候,然后弹出了系统自带的cmd窗口 解决办法: Win+R 输入cmd 打开windows cmd窗口,窗口顶部右键属性,然后取消勾选使用旧版控制台,然后重启编辑器就行了. 二. ...

  10. 【DRF序列化】

    目录 基本的序列化操作 外键/多对多关系的序列化 反序列化的操作 单条数据查询及更新 数据的校验 单个字段的校验 多个字段的校验 自定义校验器 终极用法 ModelSerializer 前后端分离后, ...