{最新}〖互联网〗大厂面试真题、Java程序员面试计谋(面试前“的”准备、面试中“的”技巧)请接见GitHub

1. 前言

Java 1.5 「引入了」 泛型[来保证类型平安,“防止在运行时发生类型”转换异常,让类型参数化,提高了代码“的”可读性和重用率。然则有些情况下 泛型[也(是不允许使用)“的”,“今天就总结一下”编码中不能使用 泛型[“的”一些场景。

2. 基本类型无法直接使用 泛型[

以下写法是错误“的”:

// error 
Map<int,char> wrong= new HashMap<>()

“基本类型是不能”够作为 泛型[类型“的”,需要使用它们对应“的”包《装》类。

// OK
Map<Integer,Character> wrong= new HashMap<>()

3. 泛型[类型无法被直接实例化

泛型[类型可以理解为一个抽象类型,只是代表了类型“的”抽象,因此我们不能直接实例化它,下面“的”做法也是错误“的”:

 public <E> E first(List<E> list){
     // error 
        E e = new E();
       return list.get(0);   
 }

4. 泛型[无法作为静态变量类型

Java 中“的”静态类型随着类加载而实例化,此时 泛型[“的”详细类型并“没”有声明。同时『由』于静态变量作为所有工具“的”共享变量,只有类实例化或者方式(调用时才)气确定其类型。若是是 泛型[类型将无法确定其类型。同样在类上声明“的” 泛型[也无法作为返回值类型泛起在类“的”静态方式中,下面“的”写法也是错误“的”:

public class Generic<T>{
    // 不能将类声明“的” 泛型[类型作为静态变量
    public static T t;
    // 也不能将类声明“的” 泛型[类型作为 静态方式“的”返回值
    public  static  T  rtval(List<T> list){
        return list.get(0);
    }
}

5. 【无法举行】 instanceof 判断

Java 中“的” 泛型[是伪 泛型[,在编译期会被擦除,{运行“的”字节码中不}存在 泛型[,以是下面“的”判断条件【无法举行】:

public static <E> void wrong(List<E> list) {
    // error 
    if (list instanceof ArrayList<Integer>) {   
    }
}

然则 泛型[“的”***通配符&lt;?&gt;可以举行instanceof判断,“你仔细想想为”什么。

6. 无法建立参数化类型“的”数组

首先下面这种写法是对“的”:

// OK
List[] arrayOfLists = new List[2];

然则加上了 泛型[就编译不通过了:

//error
List<Integer>[] arrayOfLists = new List<Integer>[2];

若是不这么规定将引发以下逻 辑[错误:

// 若是上面“的”建立,则下面“的”也应该建立
Object[] stringLists = new List<String>[];  
// 那么我们可以<放>入 ‘字符串’ List
stringLists[0] = new ArrayList<String>();   
// <放>入 Integer list
stringLists[1] = new ArrayList<Integer>();
// 《这显然不合理》

7. 不能直接或者间接扩展Throwable

下面“的”两种写法将引发编译错误:

//  不能间接地扩展 Throwable   
class IndirectException<T> extends Exception {}     

//  <不能直接地扩展> Throwable  
class DirectException<T> extends Throwable {} 

若是建立将泛起:

 try {
        // ...
    } catch (T e) {   
        // <类型不确定>  无法处置详细“的”异常逻 辑[
    }

你若何才气对异常举行详细“的”处置,这显然不便于正确“的”异常处置逻 辑[。然则你可以抛出一个 不确定“的”异常,“然则同”样不能在静态方式中使用类声明“的” 泛型[:

class Parser<T extends Exception> {
   // 这样是对“的”
    public void okThrow(File file) throws T {      
        // ...
    }
    // 静态方式不能泛起类声明“的” 泛型[类型作为返回<值和异常>
    public static void wrongThrow(File file) throws T {      
    }
}

8. 泛型[擦除后相同参数署名“的”方式不能重载

『由』于 泛型[擦除“的”缘故原『由』,以下“的”不视为方式“的”重载且无法编译 :

public class NoReload {
    public void sets(Set<String> strSet) { }
    public void sets(Set<Integer> intSet) { }
}

9. 总结

「今天总」结了 Java 泛型[“的”一些使用误区,虽然平时 IDE “的”提醒会告诉我们, 然则这也[是我们经常会忽略“的”一些知识点。