Mam 3 następujące testy. Dwie pierwsze prace, ostatnia nie. Moja motywacja do zadawania tego pytania polega na tym, że chciałbym móc rzucić obiekt A
, tak aby miał tę samą klasę co obiekt B
, kiedy A
jest znany jako podtyp B
.Dlaczego casting oparty na Class.class działa, ale nie działa getClass?
@Test
public void testWorks() {
Object bar = "foobar";
String blah = (String) bar;
System.out.println(blah); // Outputs foobar
}
@Test
public void testAlsoWorks() {
Object bar = "helloworld";
String blah = String.class.cast(bar);
System.out.println(blah); // Outputs helloworld
}
@Test
public void testfails() {
Object bar = "foobar";
String thetype = "hello";
Class stringclass = thetype.getClass();
String blah = stringclass.cast(bar); // Compiler error: incompatible types: Object cannot be converted to String
System.out.println(blah);
}
Czy ktoś może wyjaśnić, dlaczego ostatni przypadek się nie powiódł, gdy pierwsze dwa powiodły się i dlaczego tak się dzieje? I jakie byłoby lepsze podejście, aby to osiągnąć?
Zakładam, że klasa .class jest oceniana podczas kompilacji, ale metoda .getClass() jest oceniana w czasie wykonywania. – odlund
Kompilator powinien był Cię ostrzec przed użyciem surowego typu 'Class' zamiast sparametryzowanego typu' Class <> ', co byłoby twoją wskazówką, że coś jest nie tak z tą deklaracją. – Alex