“Java泛型”——快速上手使用

使用场景

通常我们在定义变量时,我们会指定变量的类型(int,float……)。可是如果,我们没想好我们需要的变量的类型,那么Java泛型可以帮我们解决这个问题。Java泛型先使用一个待定的类型,将这类型当作参数(这个类型可以是对象、包装类等,就是不能用8大基本类型),根据使用者传递过来的类型,再进行决断。具体怎么使用,请看下面的内容。

简单的泛型集合ArrayList

///正确写法
ArrayList <String> a1 = new ArrayList<String>();
ArrayList <String> a2 = new ArrayList<>();
ArrayList <String> a3 = new ArrayList();
///错误写法,不报错,但是无法实现类型限定
ArrayList a4 = new ArrayList<String>();
///错误写法,报错
ArrayList <String> a5 = new ArrayList<Object>();

我们在使用ArrayList类实例化对象时,在 <> 中传入了类型参数String,来限定可以插入集合的元素类型为String。
ArrayList集合类其实也使用了泛型类,我们可以先看一下泛型类。
ArrayList源码

泛型类的创建和使用

public class GenericType <E>{
	///类名后面跟泛型,<>中可以有一个或多个泛型参数
	private E a;
	public GenericType(E a) {
		……
	}
}

当我们创建泛型类之后,类中使用泛型定义的变量或对象的类型也就根据泛型参数来限定。

public static void main(String[] args) {
	///实例化写法和泛型集合一样
	GenericType<String> test = new GenericType<String>("hello");
}
Output:hello

泛型接口的创建和使用

public interface GenericInterface <E>{
	///接口中的变量都是private final类型,所以泛型接口中不能定义泛型变量。
	public void method(E a);
}

下面我们实现一下这个接口:

泛型接口,既可以被当作普通接口使用,也可以使用它的泛型限定功能。
  • 情形一:
	///普通类继承普通接口
	///方法中未确定类型使用Object代替
	public class Main implements GenericInterface{
		public void method(Object a) {
			……
		}
	}
  • 情形二:
	///普通类继承限定类型泛型接口(即普通接口)
	public class Main implements GenericInterface<String>{
		public void method(String a) {
			//……
		}
	}
  • 情形三:
	///泛型类继承泛型接口
	public class Main<E> implements GenericInterface<E>{
		public void method(E a) {
			……
		}
	}

泛型方法的创建和使用

public class Main{
	///泛型方法的泛型参数放在返回类型前
	///泛型方法中的泛型只能用于方法中
	public <E> void method(E x) {
		……
	}
}
public static void main(String[] args) {
		Main test = new Main();
		///这里和其他泛型参数的传递方式不同
		test.method("String");
		test.method(1);
		test.<String>method("Strings");
	}

与泛型类不同,泛型方法使用时,一般不用指定泛型参数值,根据泛型方法中的参数来自动确定是什么类型;但是如果是个无参泛型方法,那就需要指定类型。
注意一下
泛型类和泛型方法同时使用,如果泛型方法泛型参数名和泛型类的泛型参数名相同,必须分别限定它们的类型,同名不同的类型。

public class class3 <T>{
	T obj;
	public <T extends person> void method4(T x) {
		///x和obj仅仅是泛型参数名相同
		obj = x;
	}
}

指导原则

尽量使用泛型方法,能用泛型方法取代整个类的泛型化,就只使用泛型方法。

拓展一下

 泛型之前Object类的使用

Java泛型时Java5更新后确定的概念
在Java5之前,我们都是使用Object类(Object类是Java中所有类的父类)
来实现后来的泛型功能。
public class Main{
	Object a;
	public static void main(String[] args) {
		Main test = new Main();
		test.a="hello";
	}
}
使用Object就没有传参什么的,Object定义的变量可以是所有类型
如果你认为使用Object更简单,那你就错了
实例中a不管存入什么类型,其变量类型依然是Object
例如:如果想要定义一个变量b接收a
可能比避免不了类型转换,除非这个变量类型为Object。
泛型出现后更加规范,使用起来也更加简单。

在这里插入图片描述

 Java5中的自动拆箱装箱

Java5还有个特性就是自动拆箱和自动装箱,当我们将一个Integer类型变量 = int型变量时,编译器会自动调用方法将int型变量转换为Integer变量再赋值,这就是自动 装箱;反之,就是自动拆箱。

 八大基本类型和对应的包装类

byte short int long float double char boolean
Byte Short Integer Long Float Double Character Boolean
1 2 4 8 4 8 2 1
发布了20 篇原创文章 · 获赞 75 · 访问量 6899

猜你喜欢

转载自blog.csdn.net/weixin_42089228/article/details/104622892