区块链技术博客
www.b2bchain.cn

「加餐」面试官:说说 T ,T extends xxx, ?,?extends xxx 和 ?super xxx 的区别?求职学习资料

本文介绍了「加餐」面试官:说说 T ,T extends xxx, ?,?extends xxx 和 ?super xxx 的区别?求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

最近面试中,这个问题经常出现在笔试题以及面试题中。

    • 泛型
      • 什么是泛型?泛型的作用?
      • 泛型的使用方式有哪几种?
      • 项目中哪里用到了泛型?
      • 什么是泛型擦除机制?为什么要擦除?
      • 既然编译器要把泛型擦除,那为什么还要用泛型呢?用Object代替不行吗?
      • 什么是桥方法?

泛型

什么是泛型?泛型的作用?

  • Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。
  • 使用泛型参数,可以增强代码的可读性以及稳定性。编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。比如 ArrayList<Persion> persons = new ArrayList<String>() 这行代码就指明了该 ArrayList 对象只能传入 Persion 对象,如果传入其他类型的对象就会报错。
  • 可以用于构建泛型集合。原生 List 返回类型是 Object ,需要手动转换类型才能使用,使用泛型后编译器自动转换。

泛型的使用方式有哪几种?

泛型一般有三种使用方式:泛型类泛型接口泛型方法

1.泛型类

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class Generic<T>{      private T key;      public Generic(T key) {         this.key = key;     }      public T getKey(){         return key;     } }

如何实例化泛型类:

Generic<Integer> genericInteger = new Generic<Integer>(123456);

2.泛型接口

public interface Generator<T> {     public T method(); }

实现泛型接口,不指定类型:

class GeneratorImpl<T> implements Generator<T>{     @Override     public T method() {         return null;     } }

实现泛型接口,指定类型:

class GeneratorImpl<T> implements Generator<String>{     @Override     public String method() {         return "hello";     } }

3.泛型方法

   public static < E > void printArray( E[] inputArray )    {          for ( E element : inputArray ){             System.out.printf( "%s ", element );          }          System.out.println();     }

使用:

// 创建不同类型数组: Integer, Double 和 Character Integer[] intArray = { 1, 2, 3 }; String[] stringArray = { "Hello", "World" }; printArray( intArray  ); printArray( stringArray  );

项目中哪里用到了泛型?

  • 可用于定义通用返回结果 CommonResult<T> 通过参数 T 可根据具体的返回类型动态指定结果的数据类型
  • 定义 Excel 处理类 ExcelUtil<T> 用于动态指定 Excel 导出的数据类型
  • 用于构建集合工具类。参考 Collections 中的 sort, binarySearch 方法

什么是泛型擦除机制?为什么要擦除?

  • Java 的泛型是伪泛型,这是因为 Java 在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除 。
  • 编译器会在编译期间动态将泛型 T 擦除为 Object 或将 T extends xxx 擦除为其限定类型 xxx
  • 泛型本质上是编译器的行为,为了保证引入泛型机制但不创建新的类型,减少虚拟机的运行开销,所以通过擦除将泛型类转化为一般类。

这里说的可能有点抽象,我举个例子:

List<Integer> list = new ArrayList<>();  list.add(12); //1.编译期间直接添加会报错 list.add("a"); Class<? extends List> clazz = list.getClass(); Method add = clazz.getDeclaredMethod("add", Object.class); //2.运行期间通过反射添加,是可以的 add.invoke(list, "kl");  System.out.println(list)

既然编译器要把泛型擦除,那为什么还要用泛型呢?用Object代替不行吗?

该题变相考察泛型的作用。

  • 可在编译期间进行类型检测。

  • 使用 Object 类型需要手动添加强制类型转换,降低代码可读性,提高出错概率

  • 泛型可以使用自限定类型。如 T extends Comparable 还能调用 compareTo(T o) 方法 ,Object 则没有此功能

什么是桥方法?

桥方法(Bridge Method) 用于继承泛型类时保证多态。注意桥方法为编译器自动生成,非手写。

“`java
class Node {

public T data;

最近面试中,这个问题经常出现在笔试题以及面试题中。

    • 泛型
      • 什么是泛型?泛型的作用?
      • 泛型的使用方式有哪几种?
      • 项目中哪里用到了泛型?
      • 什么是泛型擦除机制?为什么要擦除?
      • 既然编译器要把泛型擦除,那为什么还要用泛型呢?用Object代替不行吗?
      • 什么是桥方法?

泛型

什么是泛型?泛型的作用?

  • Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。
  • 使用泛型参数,可以增强代码的可读性以及稳定性。编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。比如 ArrayList<Persion> persons = new ArrayList<String>() 这行代码就指明了该 ArrayList 对象只能传入 Persion 对象,如果传入其他类型的对象就会报错。
  • 可以用于构建泛型集合。原生 List 返回类型是 Object ,需要手动转换类型才能使用,使用泛型后编译器自动转换。

泛型的使用方式有哪几种?

泛型一般有三种使用方式:泛型类泛型接口泛型方法

1.泛型类

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class Generic<T>{      private T key;      public Generic(T key) {         this.key = key;     }      public T getKey(){         return key;     } }

如何实例化泛型类:

Generic<Integer> genericInteger = new Generic<Integer>(123456);

2.泛型接口

public interface Generator<T> {     public T method(); }

实现泛型接口,不指定类型:

class GeneratorImpl<T> implements Generator<T>{     @Override     public T method() {         return null;     } }

实现泛型接口,指定类型:

class GeneratorImpl<T> implements Generator<String>{     @Override     public String method() {         return "hello";     } }

3.泛型方法

   public static < E > void printArray( E[] inputArray )    {          for ( E element : inputArray ){             System.out.printf( "%s ", element );          }          System.out.println();     }

使用:

// 创建不同类型数组: Integer, Double 和 Character Integer[] intArray = { 1, 2, 3 }; String[] stringArray = { "Hello", "World" }; printArray( intArray  ); printArray( stringArray  );

项目中哪里用到了泛型?

  • 可用于定义通用返回结果 CommonResult<T> 通过参数 T 可根据具体的返回类型动态指定结果的数据类型
  • 定义 Excel 处理类 ExcelUtil<T> 用于动态指定 Excel 导出的数据类型
  • 用于构建集合工具类。参考 Collections 中的 sort, binarySearch 方法

什么是泛型擦除机制?为什么要擦除?

  • Java 的泛型是伪泛型,这是因为 Java 在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除 。
  • 编译器会在编译期间动态将泛型 T 擦除为 Object 或将 T extends xxx 擦除为其限定类型 xxx
  • 泛型本质上是编译器的行为,为了保证引入泛型机制但不创建新的类型,减少虚拟机的运行开销,所以通过擦除将泛型类转化为一般类。

这里说的可能有点抽象,我举个例子:

List<Integer> list = new ArrayList<>();  list.add(12); //1.编译期间直接添加会报错 list.add("a"); Class<? extends List> clazz = list.getClass(); Method add = clazz.getDeclaredMethod("add", Object.class); //2.运行期间通过反射添加,是可以的 add.invoke(list, "kl");  System.out.println(list)

既然编译器要把泛型擦除,那为什么还要用泛型呢?用Object代替不行吗?

该题变相考察泛型的作用。

  • 可在编译期间进行类型检测。

  • 使用 Object 类型需要手动添加强制类型转换,降低代码可读性,提高出错概率

  • 泛型可以使用自限定类型。如 T extends Comparable 还能调用 compareTo(T o) 方法 ,Object 则没有此功能

什么是桥方法?

桥方法(Bridge Method) 用于继承泛型类时保证多态。注意桥方法为编译器自动生成,非手写。

“`java
class Node {

public T data;

最近面试中,这个问题经常出现在笔试题以及面试题中。

    • 泛型
      • 什么是泛型?泛型的作用?
      • 泛型的使用方式有哪几种?
      • 项目中哪里用到了泛型?
      • 什么是泛型擦除机制?为什么要擦除?
      • 既然编译器要把泛型擦除,那为什么还要用泛型呢?用Object代替不行吗?
      • 什么是桥方法?

泛型

什么是泛型?泛型的作用?

  • Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。
  • 使用泛型参数,可以增强代码的可读性以及稳定性。编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。比如 ArrayList<Persion> persons = new ArrayList<String>() 这行代码就指明了该 ArrayList 对象只能传入 Persion 对象,如果传入其他类型的对象就会报错。
  • 可以用于构建泛型集合。原生 List 返回类型是 Object ,需要手动转换类型才能使用,使用泛型后编译器自动转换。

泛型的使用方式有哪几种?

泛型一般有三种使用方式:泛型类泛型接口泛型方法

1.泛型类

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class Generic<T>{      private T key;      public Generic(T key) {         this.key = key;     }      public T getKey(){         return key;     } }

如何实例化泛型类:

Generic<Integer> genericInteger = new Generic<Integer>(123456);

2.泛型接口

public interface Generator<T> {     public T method(); }

实现泛型接口,不指定类型:

class GeneratorImpl<T> implements Generator<T>{     @Override     public T method() {         return null;     } }

实现泛型接口,指定类型:

class GeneratorImpl<T> implements Generator<String>{     @Override     public String method() {         return "hello";     } }

3.泛型方法

   public static < E > void printArray( E[] inputArray )    {          for ( E element : inputArray ){             System.out.printf( "%s ", element );          }          System.out.println();     }

使用:

// 创建不同类型数组: Integer, Double 和 Character Integer[] intArray = { 1, 2, 3 }; String[] stringArray = { "Hello", "World" }; printArray( intArray  ); printArray( stringArray  );

项目中哪里用到了泛型?

  • 可用于定义通用返回结果 CommonResult<T> 通过参数 T 可根据具体的返回类型动态指定结果的数据类型
  • 定义 Excel 处理类 ExcelUtil<T> 用于动态指定 Excel 导出的数据类型
  • 用于构建集合工具类。参考 Collections 中的 sort, binarySearch 方法

什么是泛型擦除机制?为什么要擦除?

  • Java 的泛型是伪泛型,这是因为 Java 在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除 。
  • 编译器会在编译期间动态将泛型 T 擦除为 Object 或将 T extends xxx 擦除为其限定类型 xxx
  • 泛型本质上是编译器的行为,为了保证引入泛型机制但不创建新的类型,减少虚拟机的运行开销,所以通过擦除将泛型类转化为一般类。

这里说的可能有点抽象,我举个例子:

List<Integer> list = new ArrayList<>();  list.add(12); //1.编译期间直接添加会报错 list.add("a"); Class<? extends List> clazz = list.getClass(); Method add = clazz.getDeclaredMethod("add", Object.class); //2.运行期间通过反射添加,是可以的 add.invoke(list, "kl");  System.out.println(list)

既然编译器要把泛型擦除,那为什么还要用泛型呢?用Object代替不行吗?

该题变相考察泛型的作用。

  • 可在编译期间进行类型检测。

  • 使用 Object 类型需要手动添加强制类型转换,降低代码可读性,提高出错概率

  • 泛型可以使用自限定类型。如 T extends Comparable 还能调用 compareTo(T o) 方法 ,Object 则没有此功能

什么是桥方法?

桥方法(Bridge Method) 用于继承泛型类时保证多态。注意桥方法为编译器自动生成,非手写。

“`java
class Node {

public T data;

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 「加餐」面试官:说说 T ,T extends xxx, ?,?extends xxx 和 ?super xxx 的区别?求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们