Problémák a összehasonlítunk két generikus tárgyak

szavazat
1

Saját projekt egy telefonkönyv, amely segítségével BSTree<E>. Minden egyes csomópont a fa BTNode<E>. A fő osztály, cserélje E párral osztály, amely (String name, String number), amikor meghatározzák a csomópontokat.

Én a következő összehasonlító osztály összehasonlítani a 2 E típusok:

import java.util.Comparator;

public class BTNodeComparator<E> implements Comparator<E>
{
    public int compare(E a, E b) throws ClassCastException
    {
        return ((Comparable<E>) a).compareTo(b);
    }
}

és tudom használni azt BSTree<E>.

Most, amikor elindítja a programot és jön a komparátor, ez ad nekem a hibákat a komparátor mert most le két pár

Hogyan oldjam meg a problémát? Amit én szeretnék összehasonlítani a nevét a két párt?

Elnézést a rossz magyarázat. Az angol tudásom gyenge.

=========================

edit:

@Tim: kipróbálása után a megoldás ez ad nekem ezt a hibát:

java.lang.NullPointerException
    at Pair.compareTo(Pair.java:36) // @ return name.compareTo(pair.getName());
    at Pair.compareTo(Pair.java:2)  // @ public class Pair implements Comparable<Pair>
    at BTNodeComparator.compare(BTNodeComparator.java:24) // @ return (a.compareTo(b));
    at BTNodeComparator.compare(BTNodeComparator.java:20) // @ public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E>
    at BSTree.search(BSTree.java:285)
    at BSTree.insert(BSTree.java:300)
    at PhoneBook.main(PhoneBook.java:25)

BTW, én decleared BTNodeComparator a BSTree az alábbiak szerint:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
A kérdést 06/05/2011 02:16
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
2

Az egyetlen lehetséges meghibásodása Láttam van ClassCastException. Kijavítani a kódot akkor kell megadnia az Pairosztály, mint ez:

class Pair implements Comparable<Pair> {
    String name;
    String number;

    //some implementation stuff...

    @Override
    public int compareTo(Pair o) {
        return name.compareTo(o.name);
    }
}

Általában, ha a Comparatorvégrehajtás támaszkodik az általános típusú végrehajtási Comparableakkor meg kell adnia, mint ez:

public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E> {
    public int compare(final E a, final E b) {
        return a.compareTo(b);
    }
}

Ezzel csak ad fordításkor biztonsági megváltoztatása nélkül a szemantika, hogy a Comparatormunkálatok.

Ennek alapján a magyarázat, Gondolom ágyazzák be BTNodeComparatoraz BSTreeosztályba, mint a beágyazott belső osztályú, ami azt jelenti, hogy valószínűleg nem tudja, hogy a változás nem változik típusdefiníció a BSTreenyilatkozatot.

Válaszolt 06/05/2011 02:27
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more