jenerik uzanır ClassB ve T oluştururken çıkarsama mı? Bu istediğiniz cevaptır ama kesinlikle en basit versiyonu okur eğerİçiçe Üç sınıfları
new ClassB<ClassA<ClassR>, ClassR>()
jenerik uzanır ClassB ve T oluştururken çıkarsama mı? Bu istediğiniz cevaptır ama kesinlikle en basit versiyonu okur eğerİçiçe Üç sınıfları
new ClassB<ClassA<ClassR>, ClassR>()
emin değil:
new ClassB<ClassA<ClassR>>()
yerine: Örneğin, kullanımı uygun olur
class ClassR {
}
class ClassA<T extends ClassR> {
}
class ClassB<T extends ClassR> extends ClassA<T> {
void foo(T bar) {
}
}
public void test() {
ClassB<ClassR> classB = new ClassB<>();
}
Benim kötüyüm, E ve T'yi ClassB'nin içinde kullanıyorum, hala E'nin bir yolu var mı? (soruları güncelledi) – Nutel
Bu daha da basit bir yaklaşım sizin için işe yarayabilir:
class ClassR {}
class ClassA<T extends ClassR>{}
class ClassB<T extends ClassR> extends ClassA<T> {
void foo(T bar) {
}
void bar(ClassA<T> param) {
}
}
Ve kullanım sonra ClassA
yapılan herhangi bir atıf olmaya atlar: güvenle onun bildiriminde ClassA
türü parametresi atlayabilirsiniz ClassA
tip E
gibi
class SubR extends ClassR {}
ClassB<SubR> obj = new ClassB<SubR>();
Bence bu iyi bir cevap. Gösterilen koddan bakıldığında, 'E' asla ClassB'deki bir yöntemden döndürülmez. Ancak, ClassB'de (örneğin, 'bar' yönteminde) siz (derleyici) sadece bunun bir ClassA
uzanır.
Uygun ClassA
type parametresi, ikinci parametrede ClassB
'a zorlanır.
gösterim amacıyla kod aşağıda verilmiştir:
class ClassB<E extends ClassA, T extends ClassR> extends ClassA<T> {
private ClassA ob;
public ClassB(E e, T t) {
super(t);
ob = e;
}
}
Kullanım örneği:
class ClassR {
public ClassR() {};
}
class ClassS extends ClassR {
private int x;
public ClassS(int x) {
super();
this.x = x;
}
}
public static void test() {
ClassS data1 = new ClassS(1);
ClassB <ClassB, ClassS> first = new ClassB<>(null, data1);
ClassS data2 = new ClassS(2);
ClassB <ClassB, ClassS> second = new ClassB<>(first, data2);
}
Bu çözümle ClassA
Yan not: Konu uzatmak için daha Runnable uygulamak daha iyidir. – m0skit0
, bir fark yaratmadığından ClassR olarak değiştirildi – Nutel
Lütfen E – Al1en313