2012-07-04 2 views
0

У меня есть фрагмент кода для создания экземпляра универсального типа следующим образом:Предупреждения в инстанцировании общего типа

public class GenericMessageMapper<I ,X> 
{ 
    public X xFromI(I imf) 
    { 
     // do thing by imf argument 
     Class<X> clazz = (Class<X>)((ParameterizedType) 
            this.getClass() 
             .getGenericSuperclass()) 
             .getActualTypeArguments()[1]; 
     X x = clazz.newInstance(); 
    } 
} 

Над кода работало нормально, но MyEclipse показать предупреждение о коде (желтой под линией по подготовке clazz переменная линия) это сообщение: Type safety: Unchecked cast from Type to Class<X>

Я временные добавить следующие аннотации выше по методу xFromI:

@SuppressWarnings("unchecked") 

Какова причина этого предупреждения и что такое решение?

ответ

1

ftom2 прав - в обычной ситуации вы должны выполнить проверку экземпляра (instanceof) перед тем, как сделать это предупреждение. Но в вашем случае это невозможно, потому что дженерики в Java были реализованы путем стирания. Class<X> не является подтвержденным типом, поэтому его невозможно использовать, например, проверить, и только способ отключить предупреждение - использовать @SuppressWarnings(value = "unchecked"). Чтобы узнать больше о дженериках, вы можете использовать книгу this.

1

Это означает, что тип класса известен только во время выполнения, поэтому может возникнуть ситуация, когда вы думаете, что вы должны получить класс типа X, но на самом деле он другого типа (он не знает это во время компиляции, так как X может быть любого типа).

В принципе вы можете игнорировать это предупреждение.

2

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

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

@SuppressWarnings (value="unchecked") 

см Type safety: Unchecked cast

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