class A{
}
public class Demo
{
public static void main(String s[])
{
Object o=(Object) new Demo();
if (((A)(o)) instanceof Object)
{
System.out.println("true");
}
}
}
Получавам изключение, докато работя с класа Demo.java:
java.lang.ClassCastException: Demo cannot be cast to A
Как да се понижи o
позоваване на class A
?
Отговори:
1 за отговор № 1Да започнем от самото начало: Това е ужасен код. Това се казва:
- Вие хвърляте Demo към Object (по каквато и да е причина, тъй като в Java всичко е Object, няма нужда да се предава).
- След това качвате o, че знаете, че е тип Demo, към А (защо това ще работи?).
- Проверявате дали обектът o е от тип Object (защо това не е успешно?)
Някои бележки:
- o не трябва да се разглежда като референция, а е обект на Object, както сте го декларирали. Забравете как работят нещата в C.
- Помислете за интерфейси и ако искате A да бъде интерфейс, който Demo изпълнява.
- Можете да прехвърляте копия само на клас, който те вече разширяват.
Пример за понижение:
public class A {
int variable = 0;
}
public class Demo extends A{
}
public void testDowncast(){
Demo myClass = new Demo();
myClass.variable = 2;
A morphingTime = myClass;
System.out.println("And now Power Ranger Demo has turned into Mighty A:");
System.out.println("I am: "+morphingTime.getClass() + " and my variable is: " + morphingTime.variable);
}
4 за отговор № 2
Можете да направите това само ако Demo
простира A
в противен случай просто не можете да прехвърлите обект на клас към друг тип.
public class Demo extends A {
1 за отговор № 3
Отговорът от RJ вярно е
можете да направите това само ако
Demo
простираA
За ваша информация не е необходимо да въвеждате какъвто и да е обект, докато се присвоява Object
Object o= new Demo();
и всеки обект винаги ще бъде instanceof
Обект, т.е. състоянието ви instanceof Object
за класовите обекти винаги ще бъде true
И защо се опитваш да правиш нещата по този начин, ((A)(o))
без проверка на типа с instanceof
по-скоро трябва да бъде,
if (o instanceof A)
1 за отговор № 4
Първо, вие получавате "ClassCastException"защото действителният ви обект "o" е от тип "Demo", а класовете "Demo" и "A" не са в едно и също наследствено дърво. Не сте получили грешка при компилирането само защото сте хвърлили обекта си в клас "Object" (тъй като "A" и "Object" са в едно и също дърво на наследство). те ("Демо" и "А") да бъдат част от едно и също наследствено дърво. Например можете да удължите Демо от А. След това проверете обекта "o" без да направите така
if (o instanceof A) {
// now cast to "A"
// and invoke any accessible method (or etc.) that class A provides
((A)o).doSomthingMathod();
}
0 за отговор № 5
Трябва просто да пренапишете кода си като
Object o=new Demo();
if (o instanceof A)
{
System.out.println("true");
}
и след това вижте какви промени ако Demo extends A
0 за отговор № 6
Първото нещо, в което не е необходимо да хвърляте вашия Demo екземпляр, за да бъде обект, без да го карате, можете да присвоите Demo препратка към Object class, защото Object е супер клас от всички java класове.
public class Demo extends com.A {
}
0 за отговор № 7
Прехвърлянето е актът на препращане на базов клас към един от неговите произволни класове.
Например :
public class Parent{}
public class Child extends Parent{}
public static void main(String args[]){
Parent parent = new Child(); // Parent is parent class of Child, parent variable holding value of type Child
Child child = (Child)parent; // This is possible since parent object is currently holding value of Child class
}
Можете да се обърнете това въпрос, за да получите отговор.