В дополнение к удалению некрасивых предупреждений о приведении, как это уже упоминалось, Class.cast - это приведение во время выполнения, в основном используемое с обобщенным приведением, поскольку общая информация будет удалена во время выполнения и некоторые способы, которыми каждый обобщенный будет считаться объектом, приводит не бросать раннее исключение ClassCastException.
например, serviceLoder использует этот трюк при создании объектов, отметьте S p = service.cast (c.newInstance ()); это вызовет исключение приведения класса
когда S P = (S) c.newInstance (); не будет и может отображать предупреждение 'Безопасность типов: непроверенное приведение от объекта к S' . (аналогично объекту P = (Object) c.newInstance ();)
- просто он проверяет, что приведенный объект является экземпляром класса приведения, а затем использует оператор приведения для приведения и скрытия предупреждения, подавляя его.
Java-реализация для динамического приведения:
@SuppressWarnings("unchecked")
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException(cannotCastMsg(obj));
return (T) obj;
}
private S nextService() {
if (!hasNextService())
throw new NoSuchElementException();
String cn = nextName;
nextName = null;
Class<?> c = null;
try {
c = Class.forName(cn, false, loader);
} catch (ClassNotFoundException x) {
fail(service,
"Provider " + cn + " not found");
}
if (!service.isAssignableFrom(c)) {
fail(service,
"Provider " + cn + " not a subtype");
}
try {
S p = service.cast(c.newInstance());
providers.put(cn, p);
return p;
} catch (Throwable x) {
fail(service,
"Provider " + cn + " could not be instantiated",
x);
}
throw new Error(); // This cannot happen
}