Bunu açıklamak zor, ama her yere baktım ve iyi bir cevap bulamadım.Geçerli sınıfın türüne nasıl başvurabilirim?
Ben de yığın taşması sorular How can I refer to the class type a interface is implementing in Java? ve How do I return an instance of an object of the same type as the class passed in using Java 6?gördük ancak sorumun cevabını olamazdı. Miras uygularken bir istisna var. bir örnek vardır
, daha kolay anlaşılması için:
public interface SelfMaker <SELF>{
public SELF getSelf();
}
Ve A başka köpeklerle üreme bir Köpek var:
en Bazı arayüz denilen SelfMaker var diyelim. Yani köpek böyle bir "SelfMaker" dir:public class Dog implements SelfMaker<Dog> {
String color;
public String toString() {
return "some " + color + " dog";
}
public Dog procreate(Dog anotherDog) {
Dog son = getSelf();
son.color = color;
return son;
}
@Override
public Dog getSelf() {
return new Dog();
}
}
Ama sonra, bir köpek olan bir DomesticDog var ama onu adında güzel bir ailesi var. Şunun gibi:
Şimdi, "SelfMaker" ler olan şeylerden çiftler kolları bazı sınıf varpublic class DomesticDog extends Dog {
private String name;
public String toString() {
return super.toString() + " named " + name;
}
}
, hadi bu sınıf "Çift" diyelim. Şunun gibi:
public class Couple<T extends SelfMaker<T>> {
private T first;
private T second;
public String toString() {
return first.toString() + " and " + second.toString();
}
}
İSTİSNA: Ben DomesticDog
s birkaç oluşturmak istediğinizde
istisna geliyor. Bu <DomesticDog>
şikayet üzerine bir istisna durumu
public class CoupleOfDomesticDogs extends Couple<DomesticDog>{
public DomesticDog procreate(){
DomesticDog son = first.procreate(second);
return son;
}
}
: Bunun gibi Bound mismatch: The type DomesticDog is not a valid substitute for the bounded parameter <T extends SelfMaker<T>> of the type Couple<T>
Zaten bu sınıf Çift den genelleştirilmiş değişkeni değiştirmeye çalıştık: Couple<T extends SelfMaker<?>>
ama "oğul" bir olmayacak DomesticDog (ve ben "oğlu" bir DomesticDog olmak istiyorum). Bir miktar döküm eklerseniz, derler, ancak daha az okunaklı olacaktır.
Yani ... işte soru şu: Bu, dökümler ve genellemeler olmadan bunu başarmanın bir yolu var mı?
:
Dog
Her tip sonra parametre olarak kendileriyle bu uygulaması gerekecektir sorular/7354740/-sürekli-türü-a-type-variable-type-a-yol-için-yol) –Geçerli sınıfın sınıfı this.getClass() 'dir. Sınıf adı this.getClass(). GetName() 'dir. Bu kadar iyi. Ayrıca Java'da bir cast'i dinamik olarak belirtmenin bir yolu yoktur. –