Aşağıdaki 3 testim var. İlk iki eser, sonuncusu değil. Bu soruyu sorma konusundaki motivasyonum, A
'un B
'un bir alt türü olduğu zaman B
nesnesiyle aynı sınıfa sahip olacak şekilde A
nesnesini atabildiğimdir.Class.class'ı temel alan ancak neden getClass tabanlı olmayan döküm?
@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);
}
İlk ikisi başarılı olduğunda neden en son durumun başarısız olduğunu açıklayabilir mi, ve neden bu böyle? Ve bunu başarmak için daha iyi bir yaklaşım ne olurdu?
Class<String> stringclass = (Class<String>) thetype.getClass();
veya
Class<? extends String> stringclass = thetype.getClass();
java.lang.Class.cast(Object obj)
bu Sınıfı nesnesi tarafından temsil edilen sınıf veya arayüze bir nesneyi atmalarını:
Varsayalım çünkü .class derleme zamanında değerlendirildi, ancak .getClass() çalışma zamanında değerlendirilir. – odlund
Derleyici, "Class <>" türetilmiş türü yerine "Class" ham türünün kullanımı konusunda sizi uyarmış olmalıydı; bu, bu bildirimle ilgili yanlış olan bir ipucunuz olabilir. – Alex