this
aslında sınıfın T
örneğidir hatta bunu uzatmak garantisi yoktur çünkü.
Örneğin bu düşünün: T0 extends ExtendComparable<T0>
ve T0 T0 süper şudur: ciltli uygun olarak T0
yılında
public class T0 implements ExtendComparable<T0> {...}
public class T1 implements ExtendComparable<T0> {...}
ince uyumludur. Bu durumda this
, T0
'un bir örneğidir; (T)this
döküm (böylece (T0)this
) anlamlıdır. bağlı T0
bir T1
uygulandığı için
T1
ile beyan da doğrudur, T
T0
ikame edilir. Bununla birlikte this
, T1
ve T1
, ne süper ne de T0
numaralı bir çocuk değildir. Evet, her ikisi de ExtendedCompatible<T0>
'u uygular, ancak kardeşler arasında yayın yapamazsınız. Örneğin Tamsayı ve Çifte Sayı Sayısı ama (Integer) new Double(0.0)
başarısız. Ayrıca (T)
(T0)
çevirme işlemi başarısız oluyor.
Yaptığınız varsayım, T
'un bildirilen sınıfla aynı olacak şekilde ayarlanacağı ve şu anda bu anlambilgileri zorlamanın bir yolu olmadığıdır. Umarım bu, Java dilinin gelecekteki sürümlerinde bir noktada değişecektir, ancak belki de Java dilinin "görev gücü" nün bunu yapmamasının asıl nedeni vardır.
Tümüyle dökümden kaçınmanın bir yolu vardır, ancak ExtendedCompatible
bir arabirim yerine soyut bir sınıf oluşturduğunuzda daha iyidir.
Sen sırayla değeri olarak
this
geçmelidir değeri uzanan sınıfı tarafından korunan bir yapıcı tarafından belirlenen olacağını tip
T
nihai alanını ilan edebilir
:
public abstract class ExtendedCompatible<T extends ExtendedCompatible<? super T>> {
private final T thiz;
protected ExtendedCompatible(final T thiz) {
if (this != thiz) throw new IllegalArgumentException("you must pass yourself");
this.thiz = thiz;
}
...
public class MyExtendedCompatible extends ExtendedCompatible<MyExtendedCompatible> {
public MyExtendedCompatible() {
super(this);
}
}
ödediğiniz fiyat ekstra hafızadır Kendisine aptalca bir referans olması ve ana kurucuya this
'un geçirilmesi eklenmiş kod/CPU yükünün tüketimi.
Başka T
(this) almak için soyut bir yöntem bildirmek için olacaktır:
// Parent abstract class:
protected abstract T getThiz();
// Child class... for each class:
protected MyChildClass getThiz() { return this; }
Bu gönderi sizin yardımınıza olabilir: https://stackoverflow.com/a/25783345/4867374 –