关于泛型通配符与泛型限定

Java中泛型是在不确定具体使用哪个类型的时候进行的泛型处理,这样可以匹配多个数据类型。

而通配符 ? 是一种泛型的手段,通过一个占位符,将所需要的数据类型,不显示的说明,只是在那里模糊的占位,表示有那么一个类型。这样在我们使用泛型时,不管是定义函数还是类,都可以轻松的使用泛型。

泛型的限定:在于将泛型的通配符的作用域减小,本来泛型的通配符的作用域作用于所有的类型,但是有了限定可以将作用域大大减小,方便我们的功能实现。

具体可以分为,向上,向下 

向上:

? extends E: 可以接收E 类型或者是E类型的子类型 

向下:

? super E 可以接收 E类型 或者是E类型的父类型

下面使用一段代码来进行说明和比较,这样比较直观,可以更好的看出他们的区别:

package mypack;
/**
 * 泛型限定:
 * ? 通配符 :也可以理解为占位符
 * 泛型的限定:
 * ? extends E: 可以接收E 类型或者是E类型的子类型
 * ? super E 可以接收 E类型 或者是E类型的父类型
 */
import java.util.ArrayList;
import java.util.Iterator;

public class Fanxingxiand {
	public static void main(String[] args) {
		ArrayList<Persons> persons = new ArrayList<Persons>();
		persons.add(new Persons("aaa"));
		persons.add(new Persons("bbb"));
		persons.add(new Persons("ccc"));
		//打印父类
		print1(persons);
		print2(persons);
		print3(persons);
		ArrayList<Student> students = new ArrayList<Student>();
		students.add(new Student("111"));
		students.add(new Student("333"));
		students.add(new Student("222"));
		//打印子类
		//print(students);   是错误的,print函数是父类的,比较大,子类不能使用
		print1(students);
		print2(students);
		print3(students);
		
		//打印无关类
		ArrayList<Dogs> dogs = new ArrayList<Dogs>();
		dogs.add(new Dogs("dog1"));
		dogs.add(new Dogs("dog2"));
		dogs.add(new Dogs("dog3"));
		dogs.add(new Dogs("dog4"));
		print1(dogs); //可以打印
		//print2(dogs);  //编译出错不能打印
		//print3(dogs); //编译出错不能打印
		
		
	}
	/*
	第一种 : 只能打印父类的、
	public static void print(ArrayList<Persons> persons){
		Iterator<Persons> it = persons.iterator();
		while(it.hasNext()){
			System.out.println(it.next().getName());
		}
	}*/
	
	
	/*第二种,打印所有
	 * 可以都讲他们打印出来,但是这个是将什么类型的元素都可以打印出来
	 * */
	public static void print1(ArrayList<?> persons){
		Iterator<?> it = persons.iterator();
		while(it.hasNext()){
			System.out.println(it.next().toString());
		}
	}
	
	
	/*
	 * 3 。 泛型限定,作用是可以只能打印 Persons 和其子类的的数据 ,其他不能打印。
	 * */
	public static void print2(ArrayList<? extends Persons> persons){
		Iterator<? extends Persons> it = persons.iterator();
		while(it.hasNext()){
			System.out.println(it.next().toString());
		}
	}
	
	public static void print3(ArrayList<? super Student> persons){
		Iterator<? super Student> it = persons.iterator();
		while(it.hasNext()){
			System.out.println(it.next().toString());
		}
	}
}


class Persons {
	private String name;
	Persons(){}
	Persons(String name){this.name = name;}
	public String getName(){
		return name;
	}
	@Override
	public String toString() {
		return "Persons [name=" + name + "]";
	}
	
	
}

class Student extends Persons{
	Student(){}
	Student(String name){super(name);}
}


class Dogs{
	private String name;
	Dogs(){}
	Dogs(String name){this.name = name;}
	public String getName(){
		return name;
	}
	@Override
	public String toString() {
		return "Dogs [name=" + name + "]";
	}
}



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 泛型中的限定通配符是指在泛型类型中使用了extends或super关键字来限制泛型类型的范围,使其只能接受某个特定类型或其子类型或父类型作为参数。例如:List<? extends Number>表示只能接受Number及其子类作为参数。 非限定通配符是指在泛型类型中使用了通配符“?”来表示可以接受任何类型作为参数,但是在使用时无法获取泛型类型的具体信息。例如:List<?>表示可以接受任何类型的List作为参数,但是无法获取其中元素的具体类型信息。 ### 回答2: 泛型是Java语言中一种非常强大的特性,它能够使Java代码更加通用和安全。 在泛型中,通配符是一种非常重要的语法,它能够限制泛型的类型范围,从而使Java程序更加类型安全。通配符分为限定通配符和非限定通配符两种类型。 首先,非限定通配符就是指没有任何限制的通配符,使用“?”符号来表示。在Java中,我们可以将一个泛型对象赋值给一个非限定通配符对象,这样就可以保证代码的通用性。 举个例子,假设我们有一个ArrayList集合,集合中存储的是Animal类的对象。我们可以将这个ArrayList赋值给一个非限定通配符的对象,这样就可以将集合中的元素通用化,可以同时适用于Cat类和Dog类。 但是,如果我们想要对通配符进行类型限制,就需要使用限定通配符了。 限定通配符可以通过使用extends或者super关键字来实现。其中,extends用于限制泛型类型的上界,super用于限制泛型类型的下界。 需要注意的是,extends和super关键字只能使用在通配符中,而不能直接用在泛型中。 举个例子,假如我们有一个Animal类,以及它的两个子类Cat和Dog。我们现在想要一个可以存储Animal及其子类对象的集合,但是不想让集合存储Bird及其子类对象。这个时候,我们就可以使用限定通配符来约束集合元素的类型范围。例如: ArrayList<? extends Animal> animals = new ArrayList<Cat>(); //这是合法的 ArrayList<? extends Animal> animals2 = new ArrayList<Bird>(); //这是不合法的 这样就能够保证animals集合只存储Animal及其子类对象,而不会存储Bird及其子类对象。 总之,限定通配符和非限定通配符泛型中的两个重要概念。通过使用这些通配符,我们可以限制泛型类型的范围,使Java程序更加类型安全。 ### 回答3: 泛型中的通配符指的是在定义泛型类或方法时使用的一种特殊符号,它可以替代任何类型的实参,从而实现更加灵活的泛型代码编写。 其中,有两种常见的通配符,分别是限定通配符和非限定通配符。 非限定通配符用“?”表示,它可以匹配任何类型的实参。例如,定义一个泛型方法时可以使用“?”作为参数类型,这样就能够在方法中处理任何类型的数据。 限定通配符则使用泛型类型来表示,它可以限制通配符只能匹配某些具体的类型或其子类型。例如,定义泛型方法时可以使用“? extends Number”来限定参数类型范围,这样方法只接受Number及其子类类型的实参。 在使用通配符时,需要注意通配符只能作为参数、返回值或泛型类型变量的上界使用,不能用作实例化泛型类型或类型参数的下界。此外,通配符不能使用任何操作符,而只能使用Object类提供的通用方法。 综上所述,泛型中的限定通配符和非限定通配符是为了提高泛型程序的灵活性和适用性而设计的。通过选择适当的通配符来限制参数类型范围,可以有效避免类型转换异常和其他类型相关的问题,使泛型代码更加健壮和可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值