Witam! Szukam sposobu na to by w Javie udało się wywołac jedną z kilku metod o takiej samej nazwie, ale o różnych typach argumentów, zależnie od przekazywanego argumentu. Chciałbym znaleźć sposób na to by Java w jakiś sposób się zorientowała jakiej z jakiej klasy pochodzi dany objekt przekazany jako argument przy wywoływaniu metody.
W tym momencie sprawdzam jakiego typu jest klasa poprzez objekt.getClass().getName(), a następnie castuje do odpowiedniego typu, co nie do pozwala na dużą elastyczność kodu. Chciałbym pozbyć się sztywnego sprawdzania String'a w switchu. U mnie klasa Product jest klasą główną, a Instrument dziedziczy z Product. Jest jeszcze kilka innych klas pochodnych, ale zostały pominięte dla uproszczenia kodu. Objekt treeProducts to objekt TreeView (zawierający objekty TreeItem<Product>) z JavyFX. Listener wywołuje metodę wypełniającą informacje o zaznaczonym produkcie. Tak wygląda wspomniany sposób:
treeProducts.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<Product>>() {
@Override
public void changed(ObservableValue<? extends TreeItem<Product>> observable, TreeItem<Product> oldValue, TreeItem<Product> newValue) {
switch (newValue.getValue().getClass().getName()) {
case "com.dupa.Product":
fillDetailOfProduct(newValue.getValue());
break;
case "com.dupa.Instrument":
fillDetailOfProduct((Instrument) newValue.getValue());
break;
}
}
}
);
private void fillDetailOfProduct(Product product) {
// ...
}
private void fillDetailOfProduct(Instrument product) {
fillDetailOfProduct( (Product) product);
// ...
}
Próbówałem użyć wildcars stosując w Listenerze `<? extends Product>` zamiast `<Product>` i usunąć ww. switcha, ale po użyciu tego sposobu wykonuje się wyłącznie fillDetailOfProduct(Product product) niezależnie od klasy przekazanego objektu.
Ma ktoś z Was jakieś sugestie co mógłbym zrobić by mój pomysł zadziałał? A jeżeli czegoś takiego nie da się wykonać, to czy istnieje jakaś alternatywa na moje sprawdzanie nazwy klasy?