Я знаю, что когда компилятор Java компилирует универсальный тип, он выполняет стирание типа и удаляет все ссылки на универсальный из кода, и мой ArrayList<Cheesecake>
становится просто ArrayList
.
Вопрос, на который у меня нет четкого ответа, заключается в том, вызывает ли это замедление отсутствие этого типа (и, следовательно, обязательное приведение типов). Другими словами, если я использую стандартный компилятор Java и стандартную JVM 1.7 от Oracle:
- Включает ли байт-код приведение типа?
- Если да, включает ли он проверку во время выполнения, чтобы убедиться, что это правильный тип?
- Само преобразование занимает нетривиальное количество времени?
- Если бы я
CheesecakeList
свой собственный классCheesecakeList
который выглядит идентичноArrayList
, просто со всемиObject
обращенными кCheesecake
, я бы получил что-нибудь (опять же, только гипотетический, и меня не интересуют какие-либо побочные эффекты наличия большего двоичного файла из-за большего количества классов или дублирование в моем коде).
Меня не интересуют какие-либо другие проблемы, связанные с типом стирания, просто простой ответ от человека, который понимает JVM лучше, чем я.
Меня больше всего интересует стоимость в этом примере:
List<Cheesecake> list = new ArrayList<Cheesecake>();
for (int i = 0; i < list.size(); i++)
{
// I know this gets converted to ((Cheesecake)list.get(i)).at(me)
list.get(i).eat(me);
}
Это бросок внутри цикла дорогой и/или значительный по сравнению с:
CheesecakeList list = new CheesecakeList();
for (int i = 0; i < list.size(); i++)
{
//where the return of list.get() is a Cheesecake, therefore there is no casting.
list.get(i).eat(me);
}
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это в основном вопрос академического любопытства. Я действительно сомневаюсь, что есть какие-то существенные проблемы с производительностью приведения типов, и устранение необходимости в них не было бы даже одной из пяти лучших вещей, которые я бы сделал, если бы обнаружил ошибку в производительности в своем коде. Если вы читаете это, потому что у вас действительно есть проблема с производительностью, сделайте себе одолжение, запустите профилировщик и выясните, где находится горлышко бутылки. Если вы действительно верите в приведение типов, только тогда вы должны попытаться как-то оптимизировать его.