Java Class.cast () по сравнению с оператором броска

Я не думаю, что SVG является хорошим выбором для будущего. От Википедия :

  • "Наиболее распространенный плагин IE был произведен Adobe. Adobe, однако, планирует забрать этот продукт в начале 2009"
  • "... Internet Explorer, который не будет также поддерживать SVG в следующей версии IE8"
  • "..., у всех есть неполная поддержка SVG 1.1... "
  • "Плагин Corel SVG Viewer когда-то предлагался от Corel. Его разработка остановилась".

104
задан Alexander Pogrebnyak 20 December 2016 в 19:12
поделиться

5 ответов

Я когда-либо использовал только Class.cast (Object) , чтобы избежать предупреждений в "области дженериков". Я часто вижу методы, которые делают такие вещи:

@SuppressWarnings("unchecked")
<T> T doSomething() {
    Object o;
    // snip
    return (T) o;
}

Часто лучше заменить его на:

<T> T doSomething(Class<T> cls) {
    Object o;
    // snip
    return cls.cast(o);
}

Это единственный вариант использования Class.cast (Object) , с которым я когда-либо сталкивался.

] Относительно предупреждений компилятора: я подозреваю, что Class.cast (Object) не является особенным для компилятора. Его можно было бы оптимизировать при статическом использовании (например, Foo.class.cast (o) , а не cls.cast (o) ), но я никогда не видел, чтобы кто-нибудь использовал его, что делает попытки встроить эту оптимизацию в компилятор несколько бесполезны.

111
ответ дан 24 November 2019 в 04:11
поделиться

Во-первых, вам категорически не рекомендуется использовать практически любые заклинания, поэтому вам следует максимально ограничить их! Вы теряете преимущества строго типизированных функций Java во время компиляции.

В любом случае, Class.cast () следует использовать в основном, когда вы извлекаете токен Class через отражение . Более идиоматично писать

MyObject myObject = (MyObject) object

, а не

MyObject myObject = MyObject.class.cast(object)

EDIT: Ошибки во время компиляции

В целом Java выполняет проверки приведения только во время выполнения. Однако компилятор может выдать ошибку, если сможет доказать, что такое приведение не может быть успешным (например, приведение класса к другому классу, не являющемуся супертипом, и приведение последнего типа класса к классу / интерфейсу, не входящему в его иерархию типов). Здесь, поскольку Foo и Bar являются классами, которые не находятся в иерархии друг друга,

18
ответ дан 24 November 2019 в 04:11
поделиться

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

Все приведение типов в Java, независимо от того, как вы это делаете, выполняется во время выполнения. Информация о типе хранится во время выполнения. C ++ - это немного больше смесь. Вы можете преобразовать структуру в C ++ к другой, и это просто переинтерпретация байтов, которые представляют эти структуры. В Java так не работает.

Также универсальные шаблоны в Java и C ++ сильно отличаются. Не беспокойтесь слишком о том, как вы делаете вещи C ++ в Java. Вам нужно научиться делать что-то в стиле Java.

16
ответ дан 24 November 2019 в 04:11
поделиться

Class.cast () редко когда-либо используется в коде Java. Если он используется, то обычно с типами, которые известны только во время выполнения (т. Е. Через их соответствующие объекты Class и некоторый параметр типа). Это действительно полезно только в коде, который использует дженерики (по этой же причине он не был введен ранее).

Это не похоже на reinterpret_cast , потому что он будет ] not позволяет вам нарушить систему типов во время выполнения в большей степени, чем это делает обычное приведение (то есть вы можете «сломать» параметры универсального типа, но не можете «сломать» «реальные» типы).

Зло оператора приведения в стиле C обычно не применяются к Java. Код Java, который выглядит как приведение в стиле C, больше всего похож на dynamic_cast <>

12
ответ дан 24 November 2019 в 04:11
поделиться

C ++ и Java - это разные языки.

Оператор приведения типов в стиле C Java намного более ограничен, чем версия C / C ++. Фактически преобразование Java похоже на C ++ dynamic_cast, если объект, который у вас есть, не может быть преобразован в новый класс, вы получите исключение времени выполнения (или, если в коде достаточно информации, время компиляции). Таким образом, идея C ++ об отказе от приведения типов C не является хорошей идеей для Java

3
ответ дан 24 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: