jenerik türünü kabul eden bir sınıfım var ve ben equals
yöntemini uygunsuz bir şekilde geçersiz kılmak istiyorum (örn. Temiz görünen ve çok az miktarda kod içeren, ancak çok genel bir kullanım durumu için)."instanceof" kullanarak jenerikler için "eşittir" yöntemi nasıl uygulanır?
Şu anda böyle bir şey var:
public class SingularNode<T> {
private T value;
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object other){
if(other instanceof SingularNode<?>){
if(((SingularNode<T>)other).value.equals(value)){
return true;
}
}
return false;
}
}
Ki, ben tahmin ediyorum, oldukça kusurludur - Ben potansiyel hata atmak olabilecek şekilde, other
nesne üzerinde SingularNode<T>
bir döküm yapıyorum.
Başka bir şey - if(other instanceof SingularNode<?>)
yaptığımda aslında tam olarak doğru şeyi kontrol etmiyorum. Aslında T
türüne karşı kontrol etmek istiyorum ve ?
yazmıyor. parametreli tip SingularNode<T>
karşı kontrol instanceof yapılamadı
: Ben
?
T
içine yapmaya zaman, ben bazı hata gibi olsun. ayrıca genel tür bilgileri zamanında bu sorunun üstesinden gelebilirsiniz nasıl
de silinecektir beri yerine formu SingularNode<?>
kullanılsın mı? T.class.isInstance(other);
yapmanın bir yolu var mı?
@SuppressWarnings("unchecked")
public boolean isEqualTo(Class<?> c, Object obj){
if(c.isInstance(obj) && c.isInstance(this)){
if(((SingularNode<T>)obj).value.equals(value)){
return true;
}
}
return false;
}
Ama bu sadece ekstra yöntem parametresi ile gerçekten garip görünüyor ve equals
olduğu gibi aynı zamanda dahili bir fonksiyon değil:
orada böyle bir gerçekten çirkin kesmek çözüm varsayalım.
Jenerikleri anlayan biri lütfen bunu açıklayınız? Ben açıkça görebildiğiniz gibi, Java ile o kadar yetenekli değilim, bu yüzden biraz daha fazla detay ile açıklayınız! Örnekte
Elinizdeki hatanın nedeni, genel türlerin silinmesidir. "T" nin geçilen elemanın –
@MichalBorek mmm sınıfının aynı olup olmadığını kontrol etmesi gerektiğini düşünüyorum. Ben tam anlamıyorum. Yani başka bir sınıfta, eğer yaparsam: 'yeni SingularNode (5) .equals (yeni SingularNode ('k')),' kontrolün nerede olduğunu biliyor musunuz? –
Bir sürü kod koymak için cevabı ekledim. –