İki jenerik nesneleri karşılaştırarak ilgili sorunlar

oy
1

Projem kullanan bir Rehber olan BSTree<E>. Ağacın her düğümdür BTNode<E>. Ana sınıfı, ben sahip Çifti sınıf ile E yerine (String name, String number)I düğümleri tanımlamak,.

Ben 2 E türleri arasında karşılaştırma aşağıdaki karşılaştırma sınıf var:

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);
    }
}

ve ben bunu kullanmak BSTree<E>.

Ben programı çalıştırın ve Karşılaştırıcıya geldiğinde artık iki Çiftler arasındaki karşılaştırır çünkü Şimdi, bu karşılaştırıcısında bana hataları veriyor

Bu sorunu nasıl çözebiliriz? İstediğim iki çift isimleri arasında karşılaştırmaktır?

benim kötü açıklama için üzgünüm. İngilizcem zayıf.

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

Düzenle:

@Tim: Çözümünüzü denedikten sonra bana bu hata veriyor:

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)

aşağıdaki gibi BTW, BSTree içinde BTNodeComparator decleared:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
Oluştur 06/05/2011 saat 02:16
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
2

Görebildiğim tek olası başarısızlık ClassCastException. Kodunuzu düzeltmek için size belirtmek gerekir Pairböyle sınıfını:

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

    //some implementation stuff...

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

Senin Genel olarak, Comparatoruygulama uygulayan jenerik türüne dayanır Comparableo zaman bunu böyle belirtmelidir:

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

Bunu yapmak, sadece nasıl semantik değiştirmeden zaman emniyet derleme verir Comparatorişler.

Yorumunuza dayanarak, ben size Gömdüğünüz tahmin ediyorum BTNodeComparatoriçine BSTreeyazın tanımını değiştirmeden bu değişikliği yapamaz yani, muhtemelen iç içe geçmiş bir iç sınıf olarak sınıfın BSTreebeyanı.

Cevap 06/05/2011 saat 02:27
kaynak kullanıcı

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