2011-01-28 22 views
18

Java'da basit bir egzersiz olarak sıralanmış bir liste uygulamaya çalışıyorum. Genel yapmak için bir add(Comparable obj) sahibiyim, böylece Karşılaştırılabilir arabirimi uygulayan herhangi bir sınıfla kullanabilirim.Java "rawTo" türünün bir üyesi olarak compareTo (T) için işaretlenmemiş arama. "

Ancak, kodun herhangi bir yerinde obj.compareTo(...)'u kullandığımda, derleyiciden "unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable" alır (-Xlint:unchecked seçeneği ile). Kod gayet iyi çalışıyor ama bu sinir bozucu mesajdan nasıl kurtulacağımı anlayamıyorum.

Herhangi bir ipucu?

cevap

22

, bu uyarı Comparable nesne keyfi nesnelere kıyasla edilemeyeceğini söylüyor. Comparable<T>, tür parametresinin T tür parametresinin karşılaştırılabileceği nesnenin türünü belirttiği genel bir arabirimdir.

public class SortedList<T extends Comparable<? super T>> { 
    public void add(T obj) { ... } 
    ... 
} 
+4

olmalı 'T ' Karşılaştırılabilir uzanır. – ColinD

+0

Eh, daha önce olduğu gibi çalıştı ve çalıştı. – 3mpty

1

Öyle gibi Karşılaştırılabilir nesne "kontrol" veya tanımlamak gerekir: Özünde

add(Comparable<Object> obj) 
9

:

Yani, doğru Comparable<T> kullanmak için, böyle bir listeniz birbirine karşılaştırılabilir nesneleri depolayan kısıtlamasını, bir şeyler ifade etmek, jenerik sizin sıralanmış listesini yapmak gerekir Yöntem parametresi olarak Comparable gibi bir arabirim kullanmanız, sınıfınızı genel yapmaz, bildirir ve genel tür parametrelerini kullanmanız, onu genel olarak nasıl yaptığınızdır.

Hızlı-n-kirli cevap: Eğer Comparable<String> gibi bir ham türü olarak, genel bir arayüz olan Comparable kullanarak yerine bunu bir spesifik tip argümanları veriyoruz çünkü uyarı alıyorsunuz.

Bunu düzeltmek tür parametreleri belirterek add() jenerik yapmak için:

<T extends Comparable<? super T>> add(T obj) { ... } 

Ama bu hızlı düzeltme sınıf güvensiz genel sorunu çözmek olmaz. Sonuçta, listenizdeki tüm nesneler aynı türde olmamalı mı? Bu add yöntemi, hala farklı türleri aynı listeye girebilmenizi sağlar. Türdeş olmayan türleri karşılaştırmaya çalıştığınızda ne olur (örneğine veya Number örneğine veya bir String örneğine)? Sınıfın kullanıcısına doğru olanı yapmak için güvenebilirsiniz ve listenizde sadece bir tür şey yaptıklarından emin olabilirsiniz, ancak genel bir sınıf derleyicinin bu kuralı zorlamasına izin verecektir.

iyi bir yaklaşım: uygun düzeltme sizin sıralanmış liste sınıfı muhtemelen sadece java.util diğer koleksiyon sınıfları gibi, genel jenerik olması gerektiğidir.

Verirsin muhtemelen gibi bir şey gibi: sınıf jenerik olduğunda, add yöntemin kendine özgü biçimsel türü parametresi ilan ziyade sınıflar biçimsel türü parametresi kullandığı

public class SortedList<T extends Comparable<? super T>> 
implements Iterable<T> { 
    ... 
    public void add(T item) { ... } 
    public Iterator<T> iterator() { ... } 
    ... 
} 

Not.

genel bir sınıf oluşturmak için nasıl web üzerinde öğreticiler bol olmalı, ama burada bir örnek aşağıda verilmiştir:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ002

class Pair<X,Y> { 
    private X first; 
    private Y second; 
    public Pair(X a1, Y a2) { 
    first = a1; 
    second = a2; 
    } 
    public X getFirst() { return first; } 
    public Y getSecond() { return second; } 
    public void setFirst(X arg) { first = arg; } 
    public void setSecond(Y arg) { second = arg; } 
} 
İlgili konular