Java07-泛型

本文探讨了Java中的泛型在List和Map的使用,包括类型限制、List< List<String>>的应用,以及泛型通配符如<?>和有界通配符的使用实例。通过实例展示了如何正确处理不同类型和继承关系,以及如何创建通用方法接受不同类型的集合对象。
摘要由CSDN通过智能技术生成

(1)泛型类型

下例代码中a是一个泛型的List集合,声名List<String>将告诉编译器这个List的实例(对象)只能存储String的对象。不过要注意的是泛类类型的类型检查是在编译时进行的。

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;

    public class Easy {
    
	    public static void main(String[] args) {				
		    List<String> a = new ArrayList<>();//指定传入的对象元素		
		    a.add("212");		
		    String b = a.get(0);//不用进行类型转换,因为get()方法会返回预期类型即指定传入类型
		    System.out.println(b.toUpperCase());//212
	    }		
    }

2.扩展List<List<String>>  -泛类也是类型所以可以指定

    public static void main(String[] args) {				
	    	List<String> a= new ArrayList<>();//指定传入的对象元素		
	    	a.add("212");
		    List<List<String>> b = new ArrayList<>();//因为泛类也是类型所以可以指定
		    b.add(a);
            System.out.println(b.get(0));//[212]
		    System.out.println(b.get(0).get(0));//第一次返回的是集合a,第二次返回的是a的元素
		                                        //212
	    }

3.Map泛类- Map集合中键和值的元素可以分别定义

    public static void main(String[] args) {				
	    	Map<String,Dog> map = new HashMap<>();//Map集合中键和值的元素可以分别定义
		    Dog dog1 = new Dog(2);
		    map.put("Hello", dog1);
		    System.out.println(map.get("Hello"));
	    }

(2)"?"通配符

下例代码会产生错误,虽然String是Object的子类,但是对于泛类来说它们之间没有任何关系所以对myList使用get()功能会产生错误

    public class Easy {
	    public static void get(List<Object> a) {//该功能需要一个Object类型的集合
		
	    }

	    public static void main(String[] args) {				
	    	List<String> myList = new ArrayList<>();
	    	get(myList);//这会产生错误
	    }		
    }

解决方法

使用通配符改写get()功能

    public class Easy {
    	public static void get(List<?> a) {//使用通配符可以使该功能接收任何类型的集合
		
	    }

	    public static void main(String[] args) {				
	    	List<String> myList = new ArrayList<>();
		    get(myList);
	    }		
    }

2.有界通配符

使用有界通配符可以使功能接收对应类型的子类

1.上界 -extends

    public class Easy {
	    public static void get(List<? extends Number> a) {//使用有界通配符可以使功能接收对应类 
                                                          //型的子类
		
	    }

	    public static void main(String[] args) {				
		    List<Integer> myList = new ArrayList<>();
		    get(myList);
	    }		
    }

2.下界 -super

    public class Easy {
	    public static void get(List<? super Integer> a) {//使用有界通配符可以使功能接收对应类 
                                                         //型的超类(父类)
		
    	}

	    public static void main(String[] args) {				
		    List<Integer> myList = new ArrayList<>();
		    get(myList);
	    }		
    }

扩展

抽象类Number是表示可转换为字节、双精度、浮点、int、long和short等基本类型的数值的包装类的超类

3.泛类的类型

实例化的泛类类型时必须指定参数类型,而泛类方法的参数类型是由该对象方法调用相应的声名中推断出来的。

    class Dog<T>{
    	T x;
	    T y;
	    public Dog(T x,T y){
	    	this.x=x;
	    	this.y=y;
	    }
    }

    public class Easy {

    	public static void main(String[] args) {				
		    Dog<Integer> dog = new Dog<>(1,2);//dog对象接收的Dog构造方法只接收Integer类的数据
		    Dog<Double> dog2 = new Dog<>(1.2,2.5);//同理 注意 括号内的数据都完成了装箱的操作

	    }		
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值