Я новичок в дженериков и смотрел на этот ответ:преобразованный к типу в Java
https://stackoverflow.com/a/17165079/1632141
Он отлично работает, но я не мог понять, как работает эта часть кода.
public T calories(int val) {
calories = val;
return (T) this;
}
во внутреннем классе NutritionFacts
.
Как работает литье? Я ожидал здесь java.lang.ClassCastException
, так как мы бросаем чистый объект суперкласса в подкласс.
Что значит «чистый объект суперкласса»? 'this' всегда заканчивается типом' T' в любом случае. –
Код запускается в контексте 'public static class (GMOFacts.) Builder расширяет NutritionFacts.Builder <(GMOFacts.) Builder>'. Поэтому 'T' является собственным типом строителя, который делает его законным. Также 'this' не относится к типу суперкласса, хотя код объявлен в суперклассе. 'this' всегда является конкретным типом времени выполнения (подкласс). – zapl
@LouisWasserman: Неправда. Возможно, что 'this' не будет иметь тип' T'. – newacct