Istnieje jakaś możliwość, aby:
private A do(B b, SOMETHING)
{
if (b instanceof SOMETHING) {
przekzac do metody nazwe kalsy do porownania pozniej przez instanceof ?
Istnieje jakaś możliwość, aby:
private A do(B b, SOMETHING)
{
if (b instanceof SOMETHING) {
przekzac do metody nazwe kalsy do porownania pozniej przez instanceof ?
Możesz to zrobić w ten sposób:
public class ClassTest {
public static void main(String[] args) {
new ClassTest();
}
public ClassTestI() {
System.out.println("tekst", String.class));
System.out.println("tekst", Integer.class));
}
private <T> boolean test(T t, Class exptectedClass) {
return t.getClass() == exptectedClass;
}
}
Class.isInstance(Object), z zatem cos takiego (pseudokod):
public metoda(A a, Class<?> k) {
if (k.isInstance(a)) {
// dupa
}
}
Rozwiazanie bakeraw2 jest o tyle kiepskie, ze nie jest to to samo co instanceof. Dla hierarchii klas: Object <- Number <- Integer:
Integer a = 17;
a.getClass() == Integer.class // true
a.getClass() == Number.class // false
a.getClass() == Object.class // false
Integer.class.isInstance(a) // true
Number.class.isInstance(a) // true
Object.class.isInstance(a) // true
Wiec jak widac roznica jest spora. Moze to byc wada jak i zaleta, to zalezy od danego przypadku. Jednak 'dynamiczny instanceof' to jest zdecydowanie Class.isInstance (nawet dokumentacja tej metody tak twierdzi).
Class.isInstance() ma ta wade ze nie obejmuje interfejsow, wiec nie jest dokladnym odpowiednikiem instanceof. Uzyj Class.isAssignableFrom()
Nie wiem o czym mowisz, ten kod dziala jak nalezy:
Class<CharSequence> c = CharSequence.class;
System.out.println(c.isInstance("dupa")); // prints true
System.out.println(c.isInstance(new StringBuilder())); // prints true
CharSequence jest interfejsem ktory implementuje m.in. klasa String, lub StringBuilder, CharArray itp. Czyli isInstance zdecydowanie wspiera interfejsy. Dokumentacja tej metody mowi nawet ze jest to 'dynamiczny instanceof'. Mozesz podac przyklad ktory pokazuje co Twoim zdaniem nie dziala?
Oczywiste brednie z mojej strony. Dzieki za zwrocenie uwagi. Roznica jest taka ze isAssignableFrom() dziala z prymitywami a isInstance() nie.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.