Java中的泛型

Java中的泛型

泛型的概念

Java 泛型本质上是参数化类型,使得所操作的数据类型被指定为一个参数。

目的是支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的好处如下:

  • 类型安全
  • 消除强制类型转换

类型通配符

为了表示各种泛型List的父类,我们需要使用类型通配符,类型通配符是一个问号(?),将一个问号作为类型实参传给List集合,List<?>(意思是未知类型元素的List)。这个问号(?)被称作通配符,它的元素类型可以匹配任何类型。例如下面的代码。

实例

import java.util.ArrayList;
import java.util.List;
public class Demo{

	public static void getData(List<?> data){
		System.out.println("data:"+data.get(0));

	}
	public static void main(String[] args){
		
		ArrayList<String> name=new ArrayList<String>();
		ArrayList<Float> grade=new ArrayList<Float>();
		ArrayList<Character> sex=new ArrayList<Character>();

		name.add("张三");
		grade.add(75.5f);
		sex.add('男');
		
		getData(name);
		getData(grade);
		getData(sex);						
	}
}

运行结果

data:张三
data:75.5
data:男

如何给通配符设置相应的上下限
上限:<? extends T>
下限:<? super T>

实例

import java.util.ArrayList;
import java.util.List;
public class Demo{

	public static void getData(List<? extends String> data){
		System.out.println("data:"+data.get(0));

	}
	public static void main(String[] args){

		
		ArrayList<String> name=new ArrayList<String>();
		ArrayList<Float> grade=new ArrayList<Float>();
		ArrayList<Character> sex=new ArrayList<Character>();

		name.add("张三");
		grade.add(75.5f);
		sex.add('男');
		
		getData(name);
		//getData(grade);
		//getData(sex);					
	}
}

运行结果

data:张三

如果把注释去掉会出现编译出错

泛型方法

在Java中提供了泛型方法,如果一个方法被声明成泛型方法,那么它将拥有一个或多个类型参数。

定义泛型方法的格式

[访问权限修饰符][static][final]<类型参数列表>返回值类型方法名([形式参数列表])

实例

import java.util.ArrayList;
import java.util.List;
public class Demo{

	public static <T> void printData(T[] data){
		for(T t:data){
			System.out.print(t+" ");
		}

	}
	public static void main(String[] args){

		
		Integer[] in={1,2,3,4,5,6};
		Character[] ch={'t','y','f'};
		String[] st={"tgv","vbn"}; 

		System.out.println("整形数组:");
		printData(in);
		System.out.println();

		System.out.println("字符数组:");
		printData(ch);
		System.out.println();

		System.out.println("字符串数组:");
		printData(st);
		System.out.println();					
	}
}

运行结果

整形数组:
1 2 3 4 5 6 
字符数组:
t y f 
字符串数组:
tgv vbn 

如果要设置泛型的限制用如下的格式

[访问权限修饰符][static][final]<T extends type>返回值类型方法名([形式参数列表])

泛型类

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。

实例

public class Demo<T>{
	private T t;
	public Demo(T t){
		this.t=t;

	}
	public T get(){
		return this.t;
	}

	public static void main(String[] args){
		Demo<Integer> d1=new Demo<Integer>(2);

		Demo<String> d2=new Demo<String>("rt");

		System.out.println("整型:"+d1.get());
		System.out.println("字符串:"+d2.get());
						
	}
}

运行结果

整型:2
字符串:rt

使用泛型的一些注意事项:

  • 在代码中避免泛型类和原始类型的混用。比如List和List不应该共同使用,因为这样会产生一些编译器警告和潜在的运行时异常。
  • 在使用带通配符的泛型类的时候,需要明确通配符所代表的一组类型的概念。由于具体的类型是未知的,因此很多操作是不允许的。
  • 不要忽视编译器给出的警告信息。
Java泛型通配符用于解决类型安全问题,并提供了一种方法来引用类型,而不需要知道具体的类型参数。通配符主要有以下几种形式: 1. `?`:无界通配符,表示未知的类型,可以匹配任何对象的类型。 2. `<? extends 类或接口>`:表示具体的类型,但不是确定的类型。`extends`在这里的意思是“某种类型的子类”。这可以用来限定类型参数的上界,只允许该通配符引用某个类型或其子类型。 3. `<? super 类或接口>`:表示具体的类型,但不是确定的类型。`super`在这里的意思是“某种类型的父类”。这可以用来限定类型参数的下界,只允许该通配符引用某个类型或其父类型。 4. `? extends 类型1 & 类型2 & ... & 类型n>`:表示有限制的通配符,可以引用同时满足多个上限类型约束的类型。 使用泛型通配符的目的是为了增强代码的灵活性,同时保证类型安全。例如,如果有一个泛型方法需要接受任何类型的`List`作为参数,但不想限制这个`List`只能包含特定类型的对象,那么可以使用无界通配符`<?>`。 下面是一个简单的例子,来说明如何使用泛型通配符: ```java public class GenericWildcardExample { public static void processElements(List<?> elements) { for (Object element : elements) { // 处理元素,但不知道元素的实际类型 } } } ``` 在这个例子,`processElements`方法可以接受任何类型的`List`对象作为参数,但在方法内部,我们只能将元素当作`Object`类型来处理。 使用泛型通配符的注意事项: - 不能实例化泛型通配符。 - 不能使用带有泛型通配符的类型作为方法的参数类型,因为这会导致在调用时出现类型安全问题。 - 如果要向泛型集合添加元素,那么只能添加`Object`类型的元素,因为编译器不知道集合具体存储的是哪种类型的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值