Приведение типов. Теория.
От: Sovun  
Дата: 11.01.08 15:17
Оценка:
Добрый день.

Всегда использовал приведение типов таким образом:
ClassName obj = (ClassName)someObject;

JavaDoc любезно поделилась со мной информацией, что с версии 1.5 есть второй вариант:
ClassName obj = ClassName.class.cast(someObject);


Есть ли отличия между этими двумя способами, и какие?
Re: Приведение типов. Теория.
От: Аноним  
Дата: 11.01.08 15:42
Оценка:
Здравствуйте, Sovun, Вы писали:

S>Есть ли отличия между этими двумя способами, и какие?


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

[moderator]Избыточное цитирование удалено[moderator]
Re: Приведение типов. Теория.
От: denis.zhdanov Россия http://denis-zhdanov.blogspot.com/
Дата: 11.01.08 15:45
Оценка:
Здравствуйте, Sovun, Вы писали:

[moderator]Избыточное цитирование удалено[moderator]
S>Есть ли отличия между этими двумя способами, и какие?

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

    public static void main(String[] args) throws Exception {
        Integer i = 0;
        testCast(i, String.class); // No ClassCastException here though Integer can't be casted to String
        String s = testCast(i, String.class); // Type checking is performed only at the attempt to initialize 's' variable
    }

    public static <T> T testCast(Object object, Class<T> clazz) {
        T t = (T)object;
        System.out.println(t);
        return t;
    }


Видимо, чтобы не было нужды писать этот метод самому каждый раз, когда он нужен, его реализовали в стандартной библиотеке.
http://denis-zhdanov.blogspot.com
Re: Приведение типов. Теория.
От: Blazkowicz Россия  
Дата: 11.01.08 15:47
Оценка:
Здравствуйте, Sovun, Вы писали:
ClassName obj = (ClassName)someObject;
ClassName obj = ClassName.class.cast(someObject);

S>Есть ли отличия между этими двумя способами, и какие?
1й легко читается, 2й — не очень.
2й по идее прячет Warning: Unsafe Cast
Re: Приведение типов. Теория.
От: weirdo  
Дата: 11.01.08 16:37
Оценка:
Здравствуйте, Sovun, Вы писали:

S>Есть ли отличия между этими двумя способами, и какие?


Так как всё же сановская имплементация является основной, да и джавадоки что вы читали, скорее всего по ней писаны, то ответ можно посмотреть в коде

public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException();
return (T) obj;
}
Re: Приведение типов. Теория.
От: Blazkowicz Россия  
Дата: 11.01.08 18:28
Оценка:
Здравствуйте, Sovun, Вы писали:
S>
S>ClassName obj = ClassName.class.cast(someObject);
S>

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4881275
Re[2]: Приведение типов. Теория.
От: Sovun  
Дата: 12.01.08 12:07
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4881275


Ваш ответ, как всегда, впереди планеты всей.
Низко кланяюсь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.