Java——泛型

原创 2015年11月19日 09:42:04

Java数据类型(type)可以分为两大类:基本类型(直接包含值)和引用类型(引用对象)

基本数据类型:

   numeric:byte、short、int、long、char
   floating-point:float、double、boolean

引用类型:class interface array null


引入:

  在引入范型之前,要在类中的方法支持多个数据类型,就需要对方法进行重载,在引入范型后,可以解决此问题(多态),更进一步可以定义多个参数以及返回值之间的关系。

例如
public void write(Integer i, Integer[] ia);
public void write(Double  d, Double[] da);
的范型版本为
public <T> void write(T t, T[] ta);

命名:

 * 定义的泛型类,特点是类名后有<T> 
 * T:可以是任意大写字母,
 * 一般:
 *  E — Element,常用在java Collection里,如:List<E>,Iterator<E>,Set<E>
 *  K,V — Key,Value,代表Map的键值对
 *  N — Number,数字
 *  T — Type,类型,如String,Integer等等


一、demo1:创建不同类型的点并输出

定义一个点:

public class Point<T> {
	private T x;
	private T y;

	public Point() {
	}
	public Point(T x, T y) {
		super();
		this.x = x;
		this.y = y;
	}
	public T getX() {
		return x;
	}
	public void setX(T x) {
		this.x = x;
	}
	public T getY() {
		return y;
	}
	public void setY(T y) {
		this.y = y;
	}
	
	@Override
	public String toString() {
		return "Point [x=" + x + ", y=" + y + "]";
	}
}

public class PointTRun {

	public static void main(String[] args) {
		Point<Integer> p = new Point<Integer>();
		p.setX(new Integer(1));
		System.out.println(p.getX() + "  " + p.getY());

		System.out.println();
		
		Point<String> pStr = new Point<String>();
		pStr.setX("13com");
		pStr.setY("20cm");
		System.out.println(pStr.getX() + "  " + pStr.getY());
	}
}

二、demo2: 定义泛型接口

public interface Info<T>{//在接口上定义泛型
	public T getVar();//定义抽象方法,返回值是泛型类型
	public void setVar(T x);
}

实现接口:

/**
 * InfoImp1 不是一个泛型类,因为类名后无<T>
 * 一个非泛型类在实现泛型接口时,必须给出泛型的具体数据类型
 */
public class InfoImp1 implements Info<String> {

	private String var ;
	
	public InfoImp1(String var) {
		super();
		this.var = var;
	}

	@Override
	public String getVar() {
		return this.var;
	}

	@Override
	public void setVar(String x) {
		this.var = x;
	}
}

多泛型类型的类实现接口

public class InfoImp3<T,K,U> implements Info<T> {
	private T x;
	private U var;
	private K y;
	
	public InfoImp3(T var) {
		super();
		this.x = var;
	}
	@Override
	public T getVar() {
		return x;
	}
	@Override
	public void setVar(T x) {
		this.x = x;
	}
}

调用方法:

public static void main(String[] args) {
		InfoImp1 i = new InfoImp1("hq");
		System.out.println(i.getVar());
		System.out.println("==========================");
		
		InfoImp2<String> i2 = new InfoImp2<String>("huqing-->keep move on");
		System.out.println(i2.getVar());
		System.out.println("==========================");
		
		InfoImp3<String, Double, String> i3 = new InfoImp3<String, Double, String>("hq ---> more");
		System.out.println(i3.getVar());
	}

三、泛型数组:

public class FansArray {

	public static String[] fun2(String[] str) {//接收的数组参数只能是String类型的
		return str;
	}

	public static <T> T[] fun1(T... arg) { // 接收可变参数  类似于传了一个object类型的数组参数
		return arg; // 返回泛型数组
	}

	public static void main(String[] args) {

		Integer intArray[] = fun1(1, 2, 3, 4, 5, 6);
		Integer[] result = fun1(intArray);
		for (Integer in : result) {
			System.out.print(" " + in);
		}
		System.out.println();

		String a[] = fun1("a", "b", "c", "hello");
		String[] result1 = fun1(a);
		for (String in : result1) {
			System.out.print(" " + in);
		}
		System.out.println();
		
		//创建数组getStr
		String[] dataArray = { "自己", "定义的", "数组","测试" };
		String[] getStr = fun2(dataArray);
		
		for (String in : getStr) {
			System.out.print(" " + in);
		}
		System.out.println();
	}
}

四、泛型类型比较:自定义接口,实现该接口的类进行比较

接口:

public interface Comparable<T>{
	public boolean compareTo(T i);
}
实现类:给出比较方法

public class CompareStr implements Comparable<CompareStr> {

	private String mStr;
	
	public CompareStr(String mStr) {
		super();
		this.mStr = mStr;
	}
	
	public String getmStr() {
		return mStr;
	}

	@Override
	public boolean compareTo(CompareStr i) {
		if(mStr.length() > i.mStr.length()){
			return true;
		}
		return false;
	}
}

测试:模拟数据进行比较,实现某个方法

public class BoundType {
	public static <T extends Comparable> T min(T ...a){
		T smallest = a[0];
		for(T item: a){
			if(smallest.compareTo(item)){
				smallest = item;
			}
		}
		return smallest;
	}
	
	public static void main(String[] args) {
		CompareStr result =
				min(new CompareStr("aa"),new CompareStr("ab"),new CompareStr("bbb"),new CompareStr("a"));
		System.out.println("min:"+ result.getmStr());
	}
}
结果:min:a






版权声明:本文为博主原创文章,未经博主允许不得转载。

Java 9:装B之前你必须要会的——泛型,注解,反射

1 泛型1.1 基本概念泛型提供了编译期的类型检查,但问题远非这么简单///原生态类型 List list1 = new ArrayList(); ///规避的类型检查 List list1 = ...
  • cowthan
  • cowthan
  • 2016年12月11日 20:53
  • 862

Java基础——泛型与集合

第八章 泛型与集合第一节 泛型定义:泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、...

Java基础之——泛型(二) 通配符

说在前头的话:如果迷茫,请做好当下的事! 上一篇讲了泛型的基本知识,如果你没用看过,请参考Java基础之——泛型(一)这篇我们来讲一下泛型高级之通配符吧! 一、通配符是个什么玩意 ...

Java——协变数组和类型擦除以及泛型相关知识

近期读到协变数组和类型擦除,涉及相关的泛型和数组的知识不是很了解。所以专门找了资料整理了一下。 1.数组的协变性 数组的协变性(covariant)是指如果sub是base的子类,那么sub[]是...

黑马程序员——java基础知识之泛型、集合(Map、工具类等)

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- (一)、泛型...

黑马程序员——java基础(集合框架、泛型)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 第九章:java基础(集合框架、泛型)   本章概述: 第一部分:集合框架 第二部分:集合框...

Android Framework涉及的Java语法(二)——泛型(Generic)

泛型(Generic) 泛型的基本格式 使用泛型定义一个class public class PersonT> { private T age; public void set...
  • gjz175
  • gjz175
  • 2015年10月11日 16:04
  • 371

Java之泛型——实践准则

主要摘抄Efficient Java中关于泛型的实践准则
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java——泛型
举报原因:
原因补充:

(最多只允许输入30个字)