На самом деле вам не нужно бросать его!
Могу ли я сделать некоторые ошибки новичка
Yeap, но не беспокойтесь ... после этого вы не будете делать это снова;)
См:
$cat Funky.java
class Funky {
}
class FunkySubClass extends Funky {
}
class SomethingElse {
}
class SomeClass extends SomethingElse {
private Funky aFunkyVar;
//...
public void noNeedToCast() {
aFunkyVar = new FunkySubClass();
}
}
$javac Funky.java
$
Нет ошибок компиляции.
EDIT
можно заливать примитивы и ссылки на объекты.
Для примитивов вы «имеете», если хотите сузить значение.
Например:
int i = 255;
byte b = (byte) i;
Если вы не отбрасывают компилятор предупредит вас, «эй, вы действительно не хотите, чтобы сделать это»
...
byte b = i;
...
Funky.java:18: possible loss of precision
found : int
required: byte
byte d = i;
Кастинг походит на сообщение компилятор: «Эй, не волнуйся, я знаю, что я делаю, хорошо?"
Конечно, если вы приводите, а значение не подходит, вы получите странные результаты:
int i = 2550;
byte b = (byte) i;
System.out.println(b);
принты:
-10
Вы не нужно литые, когда тип шире, чем другого типа:
byte b = 255;
int i = b;// no cast needed
Для справок работает аналогичным образом.
Вам нужно включить, если вы хотите спуститься в иерархию классов (узкий), и вам не нужно бросать, когда вы хотите перейти в иерархию (например, в вашем примере).
Так что, если мы имеем:
java.lang.Object
|
+ -- Funky
|
+-- FunkySubclass
Вам нужно только бросить, когда у вас есть тип верхней в иерархии (Object или Напуганный) в этом случае. И вы не должны, если у вас есть тип ниже в иерархии:
void other(Object o) {
// Cast needed:
Funky f = (Funky) o;
FunkySubClass fsc = (FunkySubClass) o;
FunkySubClass fscII = (FunkySubClass) f;
// Cast not needed:
Object fobj = f;
Object fscobj = fsc;
Funky fparent = fsc;
}
С примитивов виртуальная машина знает, как усечение значение, но со ссылкой нет. Итак, если значение casted равно , а не целевого типа, вы получите java.lang.ClassCastException
во время выполнения. Это цена, которую вы должны заплатить, когда рассказываете компилятору «Я знаю, что делаю», а вы этого не делаете.
Надеюсь, это достаточно ясно и не смущает вас.
:)
Вам не нужно, если 'FunkySubClass' действительно является подклассом« Funky ». – casablanca
, если FunkySubClass расширяет Funky, тогда вам не нужно бросать, нет. –
Какую версию java вы используете? –