Подтвердить что ты не робот

Есть ли чистый способ присвоить класс универсального типа переменной?

С учетом этого кода:

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(); 

Есть ли способ получить Class a List<Integer> без ошибки или предупреждения? Я могу подавить предупреждения достаточно легко, но если Java требует, чтобы я подавил предупреждение для этого действительного кода, я очень disappoint.

С другой стороны, если подавление предупреждений является единственным способом, что является самым безопасным для подавления?

4b9b3361

Ответ 1

Это настоящий Catch-22 на Java.

Компилятор предупреждает вас, если вы не добавляете общий тип в 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") максимально возможной. Поместите их выше каждого отдельного непроверенного броска. Таким образом, совершенно ясно, кто вызывает предупреждение.

Ответ 2

Один из способов сделать это - создать собственный собственный класс. Я не уверен, что это будет отвечать вашим потребностям.

Я не совсем уверен, чего вы пытаетесь достичь. Поэтому, возможно, подстановочные знаки является ответом.

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) ;
      }
}