簡體   English   中英

是否有一種干凈的方法將泛型類分配給變量?

[英]Is there a clean way to assign the Class of a generic type to a variable?

鑒於此代碼:

List<Integer> ints = new ArrayList<Integer>();

// Type mismatch: 
// cannot convert from Class<capture#1-of ? extends List> to Class<List<Integer>>       
Class<List<Integer>> typeTry1 = ints.getClass(); 

// Type safety: 
// Unchecked cast from Class<capture#2-of ? extends List> to Class<List<Integer>>
Class<List<Integer>> typeTry2 = (Class<List<Integer>>) ints.getClass();

// List is a raw type. References to generic type List<E> should be parameterized
Class<? extends List> typeTry3 = ints.getClass(); 

有沒有辦法在沒有錯誤或警告的情況下獲取List<Integer>Class 我可以很容易地抑制警告,但如果Java要求我禁止對這個有效代碼發出警告,我會非常失望

另一方面,如果警告抑制是唯一的方法,最安全的壓制是什么?

這是Java中真正的Catch-22。

如果您沒有向List添加泛型類型,編譯器會發出警告:

// WARN: List is not typed
Class<? extends List> typeTry3 = ints.getClass();

這是因為,在大多數情況下,最好輸入您的列表。

但是,由於類型擦除,Java無法在運行時找出通用類型的List ,並且編譯器知道這一點。 因此, Class上沒有返回類型化對象的方法:

// ERROR: ints.getClass() doesn't return a Class<List<Integer>>, it returns a Class<List>
Class<? extends List<? extends Integer>> var = ints.getClass();

因此,您必須將其強制轉換為類型列表。 但是,正如您所知,由於沒有運行時類型檢查,Java會警告您對類型化變量的任何轉換:

// WARN: Casting to typed List
Class<List<Integer>> typeTry2 = (Class<List<Integer>>) ints.getClass();

任何解決這個問題的嘗試本質上都是混淆編譯器的一種方法,並且不可避免地會令人費解。

那么你最好的選擇是選擇B:

另一方面,如果警告抑制是唯一的方法,最安全的壓制是什么?

抑制此警告的最安全方法是使@SuppressWarnings("unchecked")注釋盡可能本地化。 將它們放在每個未經檢查的演員表上方。 這樣就絕對清楚是誰造成了警告。

一種方法是創建自己的類 我不確定這是否符合您的需求。

我不確定你想要實現的目標。 所以也許是通配符就是答案。

import java.util.*;

class Main
{
      public static void main(String[] args)
      {
            List<Integer> list = new ArrayList<Integer>();
            Class<?> clazz = list.getClass();
            System.out.println(clazz) ;
      }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM