corejava基础知识(3)-泛型

泛型

泛型类与方法的一般格式

泛型类:

public class Pair<T>
{
    private T first; 
    private T second;
    
    public Pair() { first = null ; second = null; }
    public Pair(T first, T second) { this.first = first; this.second = second; }
    
    public T getFirst() { return first; } 
    public T getSecond() { return second; }
    
    public void setFirst(T newValue) { first = newValue; }
    public void setSecond(T newValue) { second = newValue; }
}
复制代码

泛型方法:

class ArrayAlg
{ 
	public static <T> T getMiddle(T... a)
	{
		return a[a.length / 2];
	}
}
复制代码

该方法是在普通类定义的泛型方法,调用时:

String middle = ArrayAlg.<String>getMiddle("]ohnM, "Q.n, "Public");

术语:

  • ArrayList<E> – 泛型类型
  • ArrayList – 原始类型
  • E – 类型参数(变量)
  • <> – 读作”typeof”
  • ArrayList<Integer> – 参数化的类型
  • Integer – 实际类型参数

类型变量的限定

我们可以对类型变量加以约束,毕竟我们很难适用每种泛型。可以通过对类型变量 T 设置限定(bound) 实现这一点,格式如下:

<T extends BoundingType>

BoundingType 可以是

  • :T 是它的子类型(subtype)
  • 接口: T 是实现了该接口的类

可以有多个接口,当然至多有一个类,用 “&” 分隔。

ps: 由于类型擦除机制,为了提高效率,应该将标签(tagging) 接口 (即没有方法的接口)放在边界列表的末尾。

泛型转化的内部

  • 虚拟机中没有泛型, 只有普通的类和方法;所有的类型参数都用它们的限定类型替换。
  • 编译器在调用泛型方法时会自动插入强制类型转换。
  • 桥方法被合成来保持多态。

约束与局限性

  • 不能用基本类型实例化类型参数

即没有Pair<double>,只有Pair<Double>。原因是类型擦出后,Object不能存储double值,毕竟它不是对象

  • 运行时类型查询只适用于原始类型

所有的类型查询只产生原始类型,例子:

Pair<String> stringPair = ...;
Pair<Employee> employeePair = ...;
if(stringPir.getClass() == employeePair.getClass()) // they are equal
复制代码
  • 不能创建参数化类型的数组

Pair<String>[] table是错的;

只能使用AllayList: ArrayList<Pair<String>> table

  • Varargs警告

向参数个数可变的方法传递一个泛型类型的实例时,为了调用这个方法,Java 虚拟机必须建立一个参数化类型的数组,可是这违反了前一个规则。

我们可以用 @SafeVarargs 直接标注该方法,这样就能正常运行。

  • 不能实例化类型变量

例如:

public Pair() { first = new T(); second = new T(); } // Error

  • 不能构造泛型数组

  • 泛型类的静态上下文中类型变量无效

也就是不能在静态域或方法中引用类型变量。

  • 不能抛出或捕获泛型类的实例
  • 可以消除对受查异常的检查
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值