2013-08-11 2 views
0

В Java (Android) У меня был некоторый код, который выглядит следующим образом:Sneaky Java отливать

for (Tuple tuple : xRange) { 
    Tuple5<Integer, Integer, Double, Double, Double> t = (Tuple5<Integer, Integer, Double, Double, Double>)tuple; 
    ... 
} 

Что может быть боль, чтобы написать. Кстати, Tuple5 происходит от Tuple.

Так что я написал этот метод:

@SuppressWarnings("unchecked") 
public static final <U1, U2 extends U1> U2 cast(U1 inst) { 
    return (U2)inst; 
} 

Выглядит противный, да? Но это тогда позволило мне переписать код так:

for (Tuple tuple : xRange) { 
    Tuple5<Integer, Integer, Double, Double, Double> t = cast(tuple); 
    ... 
} 

Я компиляции на Android с помощью AIDE компилятора. Я думаю, что он даже не может компилироваться в других системах.

Мой вопрос заключается в том, что это работает на всех компиляторах? Это плохой код? И если это так, то почему?

Благодаря

+0

Как объявляется 'xRange'? – jlordo

+0

Вы думаете, что он не будет компилироваться в других системах или не компилируется в других системах? Это два очень разных наблюдения. – Jeffrey

+0

В большинстве случаев это плохо imho. Однако не хуже первого фрагмента. Тем не менее, я бы рекомендовал вам проверить, действительно ли кастинг может быть успешным до кастинга, поэтому вы можете пропустить неподдерживаемые записи коллекции (в отличие от сбоев вашей программы в непередаваемых записях). – dst

ответ

1

Я думаю, что это плохо, потому что тип стирания, это не случайно, что вы получите предупреждение компилятора (который вы подавляете).

Ваш метод

public static final <U1, U2> U1 cast(U2 inst) { 
    return (U1)inst; 
} 

выглядит как это после того, как тип стирания:

public static final Object cast(Object inst) { 
    return (Object)inst; 
} 

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

+0

Спасибо. Вы говорите, что возвращает Object, но как это обрабатывается в точке вызова? ('t = cast (tuple);') –

+0

@ChrisNash будет отображаться как в первом фрагменте (например, '(Tuple5 ) cast (tuple)'). – dst

+0

@ChrisNash см. [Это] (http://stackoverflow.com/questions/11353555/what-happens-to-casts-using-generics-tobject-at-run-time-in-java?rq=1) вопрос – Katona