moukoublen Δημοσ. 11 Δεκεμβρίου 2012 Δημοσ. 11 Δεκεμβρίου 2012 Γράφοντας κάτι σε Java έφτασα πάνω στα εξής στοιχεία που μου προκαλούν ένα περίπου πρόβλημα. Δεν μπορείς να φτιάξεις (Σε μια template συνάρτηση) πίνακα του template τύπου. και Πίνακς και Collection<T> είναι διαφορετικά πράγματα οπότε δε μπορείς να έχεις έναν γενικό τύπο που να περιγραφεί κάθε ( πως να το πω; ) πολλαπλότητα όπως π.χ. το IEnumerable στο .net. Πάμε στο θέμα τώρα. Φτιάχνω μια template συνάρτηση in που δέχεται ένα αντικείμενο και ένα πίνακα (της μορφής T... items, variable number of arguments) καθώς και ένα interface για το πως να εξετάζεται η ισότητα μεταξύ των δύο ίδιων αντικειμένων. Έχουμε > public interface Equality<T> { public boolean isEqual(T r, T l); } public static<T> boolean isIn(T item, Equality<T> eq, T... items) { boolean ret = false; for(T t : items) { if(eq.isEqual(item, t)) { ret = true; break; } } return ret; } Ωραία. Τώρα θέλω να κάνω το ίδιο και για Collection<T>. Και πρέπει να ξαναγράψω ακριβώς τον ίδιο κώδικα αλλάζοντας την τελευταία παράμετρο της υπογραφής. Υπάρχει καμιά πιο έξυπνη λύση ώστε να μπορέσω απο το ένα isIn να χρησιμοποιήσω το άλλο; Αν γινότανε να φτιάξεις πίνακα από template θα λυνόταν εύκολα ως εξής. > public static<T> boolean isIn(T item, Equality<T> eq, Collection<T> items) { return isIn(item, eq, items.toArray( new T[ items.size() ] ) ); } Επίσης γίνεται το αντίθετο. Να φτιάξω την συνάρτηση για Collection και η συνάρτηση με τον πίνακα να φτιάχνει ένα Collection απο τον πίνακα και την καλεί. Αλλά δε μου "κάθεται" πολύ καλά αυτό.
moukoublen Δημοσ. 11 Δεκεμβρίου 2012 Μέλος Δημοσ. 11 Δεκεμβρίου 2012 Τελικά ψάχνοντας στον ίδιο τον κώδικα του jdk βρήκα μια λύση. > @SuppressWarnings("unchecked") public static<T extends Object> boolean isIn(T item, Equality<T> eq, Collection<T> items) { return isIn(item, eq, items.toArray( (T[]) Array.newInstance( ((Object)item).getClass(), items.size()) ) ); } Την ίδια τεχνική με το Array.newInstance και cast χρησιμοποιούν στο jdk εσωτερικά στο Arrays.copyOf() Ωστόσο αν υπάρχει κάποια πρόταση ή ιδέα, είναι ευπρόσδεκτη.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα