JavaSE-泛型

0.阿里巴巴面试题

  1. 为什么要使用泛型?
    泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
    具体来说,将运行时期的ClassCastException,转移到了编译时期变成了编译失败;避免了类型强转的麻烦。
  2. 泛型擦除是怎么回事?
    简单的说就是,类型参数只存在于编译期,在运行时,Java 的虚拟机 ( JVM ) 并不知道泛型的存在。
public class ErasedTypeEquivalence {
    public static void main(String[] args) {
        Class c1 = new ArrayList<String>().getClass();
        Class c2 = new ArrayList<Integer>().getClass();
        System.out.println(c1 == c2);
    }
}

上面的代码有两个不同的 ArrayList,在我们看来它们的参数化类型不同,一个保存整性,一个保存字符串。但是通过比较它们的 Class 对象,上面的代码输出是 true。这说明在 JVM 看来它们是同一个类。而在 C++、C# 这些支持真泛型的语言中,它们就是不同的类。

Java 泛型擦除是 Java 泛型中的一个重要特性,其目的是避免过多的创建类而造成的运行时的过度消耗。所以,像ArrayList 和 ArrayList 这两个实例,其类实例是同一个。

  1. 泛型擦除的时间?
    编译的时候进行泛型擦除。

1 泛型概述

集合默认是可以存储任何对象的,因为任何东西放在集合,它都把他们看做Object类型。(本来就是一个box,你想装什么都可以,但是有一天你发现分类装东西更方便,就需要在放之前指定类型)

JavaSE-泛型_第1张图片
结果:在打印整型数据123时报错。因为你放进去的是整型,拿出来你想把它变成String。

abc
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at fanxing.Demo1.main(Demo1.java:15)
  • 泛型:可以在类或方法中预支地使用未知的类型。

tips:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。

2 使用泛型的好处

  • 将运行时期的ClassCastException,转移到了编译时期变成了编译失败。(所以编译时会检查数据类型)
  • 避免了类型强转的麻烦。

如下:指定泛型类型后,如果放入其他类型,会提示编译错误。
JavaSE-泛型_第2张图片

tips:泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。

3 泛型的定义与使用

3.1 定义和使用含有泛型的类

修饰符 class 类名<代表泛型的变量> { }:创建对象时确定泛型的类型

3.2 泛型方法

修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }:调用方法时确定泛型的类型,用于不知道方法返回类型的时候

JavaSE-泛型_第3张图片
如上所示:泛型类和泛型方法没有关系,泛型类中的方法不一定是泛型方法,泛型方法也和类无关。各自负责各自的事情。

3.3 含有泛型的接口

修饰符 interface接口名<代表泛型的变量> { }
1、定义类时确定泛型的类型
2、始终不确定泛型的类型,直到创建对象时,确定泛型的类型
JavaSE-泛型_第4张图片

你可能感兴趣的:(#,JavaSE)