У меня есть общий код, который я не могу понять, как законно предотвратить получение предупреждений; Я использую @SuppressWarnings («unchecked») на данный момент, так как кажется, что отличать родовой тип нельзя без предупреждений.Предупреждения в Java при отливке на общий тип
Как я могу избавиться от аннотации?
Что у меня есть:
public MyObject(SharedContext<Object> ctx) {
super(ctx); // set protected field 'context'
...
context.set("Input Fields" ,Collections.synchronizedMap(new TreeMap<String,Pair<String,Boolean>>(String.CASE_INSENSITIVE_ORDER)));
context.set("Output Fields" ,Collections.synchronizedMap(new TreeMap<String,String> (String.CASE_INSENSITIVE_ORDER)));
context.set("Event Registry",new EventRegistry(log) );
}
@SuppressWarnings("unchecked")
protected void startup() {
inputFields =(Map<String,Pair<String,Boolean>>)context.get("Input Fields" ,null);
outputFields =(Map<String,String> )context.get("Output Fields" ,null);
eventRegistry =(EventRegistry )context.get("Event Registry",null);
...
}
Защищенная переменная контекст типа SharedContext<Object>
.
Без аннотаций компилятор дает предупреждение:
...\MyClass.java:94: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.Map<java.lang.String,com.mycompany.Pair<java.lang.String,java.lang.Boolean>>
inputFields =(Map<String,Pair<String,Boolean>>)context.get("Input Fields" ,null);
^
...\MyClass.java:95: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.Map<java.lang.String,java.lang.String>
outputFields =(Map<String,String> )context.get("Output Fields" ,null);
Лично я считаю, что «GenUtil.uncheckedCast» хуже зла, чем пресекать конкретное предупреждение: нет никакой гарантии, что этот метод утилиты используется ответственно, то есть таким образом, чтобы это не вызывало загрязнение кучи, но программисты больше не запрашивают с предупреждением о попытке более надежной реализации. (Который иногда, хотя и не всегда, возможен ...) – meriton
Я не согласен - любой актер по сути информирует компилятор: «Я знаю, что это за тип, а вы этого не делаете, так что выходите из моего пути и принимаем мои слово для этого ». Предупреждение, испущенное в этом обстоятельстве, просто не должно быть там - это похоже на компилятор, говорящий: «Я знаю, что не знаю, но я не уверен, что вы тоже». –
Компилятор не принимает ваше слово, он испускает проверку времени выполнения. Приведение может быть (и иногда используется) как утверждение о типе объекта. Предупреждение сообщает вам, что эта проверка неполна и, следовательно, нельзя полагаться. – meriton