2010-12-12 17 views
5

Generics kullanarak bazı sınıflar yazıyorum ancak SolutionsSubset sınıfı için bir özümü bulamıyorum ve bu yüzden "tür parametresi hatası alıyorum S kendi sınırları içinde değildir ". Aynı hata hakkında önceki soruları okudum ama durumum için çözemiyorum. Herkes, jeneriklerle ilgili bilgilerimi geliştirmeme yardımcı olabilir mi? İyi bir kitap için herhangi bir referans (Ben google çok bulabilirsiniz ama birileri bir kitap tavsiye edebilirse, öğretici, vb hoş geldiniz). Bir soru sormanın kurallarını aklımda tutmaya çalıştım ama sorularımın bu kuralları yerine getirmemesi durumunda özür dilerim.Java jeneriklerini kullanarak hata hakkında: "S parametresi kendi sınırları içinde değil"

 


public interface Subset<T extends Comparable<T>> extends Comparable<Subset<T>> 
public class MathSubset<T extends Comparable<T>> extends TreeSet<T> implements Subset<T> 

public interface Solution<T extends Comparable<T>> 

public interface Solutions<S extends Solution<?>> extends Iterable<S> 
public class SolutionsSubset<S extends Solution<?>> extends MathSubset<S> implements Solutions<S> 

 

Ben Alt Küme Karşılaştırılabilir uzanan gerekir:

aşağıdaki sınıfları ve arabirimleri var. SolutionsSubset'te, MathSubset sınıfı Çözüm nesnelerini depolar. Çalışması için bu tanımlamayı değiştirmek zorundayım? peşin Her

cevap

1

İlk içinde

Teşekkür sen, burada tam hatası (belirli bir doğru parametre almıyor MathSubset için) 'dir: Bound mismatch: The type S is not a valid substitute for the bounded parameter <T extends Comparable<T>> of the type QifFixer.MathSubset<T>

sorun MathSubset bir <T extends Comparable<T> beklediğini, ancak Bir S extends Solution<?> veriyoruz - bu türler birbirleriyle hiçbir ilgisi yoktur, çünkü bir Çözüm Comparable<T>'u devralmaz veya uygulamaz. MathSubset iterable uygulayan çünkü

public class SolutionsSubset<S extends Comparable<S>> extends 
    MathSubset<S> implements Solutions<Solution<S>>; 

Maalesef bu HALA çalışmaz, ama çok Çözümleri yapar:

şey varsa, bu deneyebilirsin.

Çözümlerin Genişletilememesi için kolay bir çözüm olurdu, ancak gerçekten ihtiyacınız olduğundan daha karmaşık bir yaklaşım kullanmaya çalıştığınız gibi geliyor. "Bir-bir" yerine "bir-bir" olabilir, burada daha faydalı olabilir mi?

+0

Yardımlarınız için teşekkür ederiz; Sonunda bir "has-a" tasarımına geçmeye karar verdim. Her neyse, çözümün daha iyi bir şekilde anlamamı sağladı. Java'da Generics – user539694

1

Jenerikler, özellikle "tüm jenerik ol" kelimelerini bir kerede denerseniz, hızlıca elden çıkabilen bir şeydir. Az daha çoktur. Bana her zaman yardımcı olan şey, somut (uygulama dahil) başlatmak ve daha sonra bir seferde bir parametre ve sınıftaki jenerik parametreleri değiştirmek.

Generikler hakkındaki bilgimi geliştirmeme yardım eden var mı? http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

Değil öğretici

, ama yararlı bilgiler bir sürü. Bu referanslardan biri, anlayabileceğiniz bölümleri okuduğunuzu, ancak daha fazla ustalık kazanacağınız ve daha fazla anlam kazandıracağınız için gelecekte tekrar tekrar tekrar gelmeye başlıyor.

+0

Çok teşekkür ederim. Java ve Generics hakkında çok iyi bir web. – user539694

6

MathSubset, SolutionsSubset s S türünde argüman olarak kullanılmaları için extend Comparable<S> olmalıdır.

import java.util.TreeSet; 

interface Subset<T extends Comparable<T>> 
    extends Comparable<Subset<T>> { } 

class MathSubset<T extends Comparable<T>> 
    extends TreeSet<T> 
    implements Subset<T> 
{ 
    public int compareTo(Subset<T> other) { throw new Error(); } 
} 

interface Solution<T extends Comparable<T>> { } 

interface Solutions<S extends Solution<?>> extends Iterable<S> { } 

class SolutionsSubset<S extends Solution<?> & Comparable<S>> 
    extends MathSubset<S> 
    implements Solutions<S> 
{ } 

birkaç yorum: a Derlenebilir örnek olarak bu çok soyut örnek ve düşünmek o kadar kolay değildir. Kodun döşenmesi için kaydırma yapmanız gerekmiyor.Burada çok fazla kalıtım var, belki de TreeSet'u uzatmaktan ziyade. Solutions ve Solution tanımlayıcıları arasında ayrım yapmak zor.

+0

Teşekkürler. Sonunda tasarımınızı daha basit hale getirmek için değiştirdiğime rağmen çözümünüz ilginçti. – user539694

İlgili konular