2015-01-04 1 views
8

В последнее время я много делаю с отражением и реализовал этот небольшой полезный метод. Я с удивлением обнаружил, что первая версия не компилируется, но последняя делает.неожиданная ошибка компиляции, получающая класс массива класса

не компилируется:

public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) { 
    return Array.newInstance(componentType, 0).getClass(); 
} 

Собирает и работает просто отлично:

public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) { 
    Class c = Array.newInstance(componentType, 0).getClass(); 
    return c; 
} 

Два вопроса: что случилось с ним? есть ли лучший способ сделать это?

Вот ошибка компиляции из первого:

TypeUtils.java:[12,60] incompatible types: java.lang.Class<capture#1 of ? extends java.lang.Object> cannot be converted to java.lang.Class<T[]> 

ответ

4

Тип возврата getClass() является Class<?>.

В вашем примере вы назначаете Class<?> на Class<T[]> (в операторе return), что неверно, вам нужно сделать бросок.

Это будет компилироваться:

@SuppressWarnings("unchecked") // added to suppress compiler warning 
public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) 
{ 
    return (Class<T[]>) Array.newInstance(componentType, 0).getClass(); 
} 

Со вторым Например, можно использовать необработанный тип Class, который работает нормально - литье сырого типа, кажется, неявными. Однако вы получите предупреждение о компиляторе, так как это не рекомендуется.

Если вы правильно параметризуете его как Class<?>, вам также потребуется литье.

+0

Ах. Я попробовал это, но intellij все еще был расстроен (красное подчеркивание о неконвертируемых типах) даже с предупреждениями подавления. Кажется, я нашел ошибку. – RutledgePaulV

+0

Если у вас есть актерский состав, все должно быть в порядке. Может быть, у вас IDE настроена на такое предупреждение, как ошибка? Я знаю, что вы можете сделать это в Eclipse. – MightyPork

+0

Хм, я искал способы настроить уровень на такой ошибке, но не нашел его. Я также вижу, что jetbrains исправил случай (здесь http://youtrack.jetbrains.com/issue/IDEA-105846) как это как ошибка раньше, поэтому я отправлю его. – RutledgePaulV

Смежные вопросы