疯狂Java讲义_Chapter09泛型(有需要再更)


1.泛型入门

1.编译时不检查类型的异常

  • 当把一个对象放入没有泛型的容器中时,对象会转换成Object类型,拿出来的时候还要通过强制转换转为想要的数据类型;
  • 异常程序:

import java.util.*;

public class Collection
{
    public static void main(String[] args)
    {
        var strList = new ArrayList();
        strList.add("adsdsd");
        strList.add("wwwwwwwww");
        // 添加一个int类型元素
        strList.add(5); //放入的时候按Object处理,拿出的时候还是原来的类型
        strList.forEach(str -> System.out.println(((String) str).length()));    //引发转换异常
    }
}

 

2.使用泛型

  • java5引入了“参数化类型”,允许程序在创建集合时指定集合元素的类型;例如ArrayList<String>,这种限定了容器内元素类型的方式就被称为泛型;
  • 泛型示例:

import java.util.*;

public class GenericList
{
	public static void main(String[] args)
	{
		List<String> strList = new ArrayList<String>();  
		strList.add("sfsdfsd");
		strList.add("dfsdfsdfsdfsd");
		
//		strList.add(5);    //提示出错
		strList.forEach(str -> System.out.println(str.length())); 
	}
}

3.Java9增强的菱形算法

  • 在Java7之前,用泛型定义的对象要在前后都加上泛型说明;
  • java7提出了菱形算法,允许后面不带泛型说明:
import java.util.*;

public class DiamondTest
{
	public static void main(String[] args)
	{
		// 菱形算法会自动推导容器类型
		List<String> books = new ArrayList<>();
		books.add("fdsfsdf");
		books.add("fsdfsdfsdf");
		// 遍历数据
		books.forEach(ele -> System.out.println(ele.length()));

		Map<String, List<String>> schoolsInfo = new HashMap<>();

		List<String> schools = new ArrayList<>();
		schools.add("dsfsfa");
		schools.add("dfdsfsdfsdfsd");
		schoolsInfo.put("school1", schools);
		// 
		schoolsInfo.forEach((key, value) -> System.out.println(key + "-->" + value));
	}
}

 

2.深入泛型

1.定义泛型类、泛型接口

  • 在定义类、方法、接口时使用类型形参,这个类型形参将在声明变量、调用方法时动态指定其类型;

  • 定义泛型类:

public class Apple<T>
{
	// 在类中定义的T类型可以用于定义变量类型
	private T info;
	public Apple(){}    //构造器名还是原来的名称
	public Apple(T info)
	{
		this.info = info;
	}
	public void setInfo(T info)
	{
		this.info = info;
	}
	public T getInfo()
	{
		return this.info;
	}
	public static void main(String[] args)
	{
		//可以根据泛型定义不同的实现类 
		Apple<String> a1 = new Apple<>("字符串");
		System.out.println(a1.getInfo());
		
		Apple<Double> a2 = new Apple<>(5.67);
		System.out.println(a2.getInfo());
	}
}

 

2.从泛型类派生子类

  • 泛型类派生子类,子类不能带有泛型提示符,且父类要明确传入的泛型类型:
public class A1 extends Apple<String>
{
	// 重写父类的方法
	public String getInfo()
	{
		return "子类" + super.getInfo();
	}

}

3.并不存在泛型类

  • 对于Java来讲,不论泛型形参传入什么实参,它们依然被当作同一个类处理;所以静态方法、静态变量不能使用泛型;

 

3.类型通配符

4.泛型方法

5.擦除和转换

6.泛型与数组

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值