2017-05-22 46 views
7

:Java neden sınırlı jenerikler söz konusu olduğunda 2 bildirilmiş yöntem olduğunu iddia ediyor? Aşağıdaki tanımlamalar ile

public interface BaseService<T, ID> { 

    T findOne(ID id); 

} 

public class BaseServiceImpl<T,ID extends Serializable> implements BaseService<T, ID> { 

    @Override 
    public T findOne(ID id) { 
     return null; 
    } 

} 

neden BaseServiceImpl.class.getDeclaredMethods() dönüş 2 yöntem:

  • public java.lang.Object BaseServiceImpl.findOne(java.io.Serializable)
  • public java.lang.Object BaseServiceImpl.findOne(java.lang.Object)

bu filtrelemek için bir yolu var mı?

+3

'Object' imzasının köprü yöntemi olarak işaretlenip işaretlenmediğini kontrol edebilir misiniz? – chrylis

+0

@chrylis Evet, gerçekten öyle! Bu benim acil sorunumu çözüyor. Çok teşekkürler! Eğer bir cevabı birazcık daraltmak istiyorsan, onu kabul etmekten/kabul etmekten memnuniyet duyarım. – kaqqao

+0

Köprü kurallarını uygun bir cevap yazmak için yeterince iyi anlamıyorum, sadece topladığım desene uyduğunu fark ettim. – chrylis

cevap

5

Bu, tür silme işleminin bir sonucudur. Bayt kod düzeyinde, genel imzalar, JVM'nin yöntem dağıtımı için kullanılmayan, yalnızca yöntemlerin ek bir özniteliğidir. Gerçek bayt kod düzeyi imzası, tip değişkenin ilk türünden türetilmiştir, örn. T extends Number&Serializable tür değişkeni için, ham imzanın T yerine kullanılması Number olacaktır. Bildirinizle için

,

public interface BaseService<T, ID> { 
    T findOne(ID id); 
} 

T ve IDObject ile ikame edilir; Yöntemin silinen imzası Object findOne(Object). sildim imza Object findOne(Serializable) olması uygulama yöntemini neden alt tip beyanı

public class BaseServiceImpl<T,ID extends Serializable> implements BaseService<T, ID> { 
    @Override 
    public T findOne(ID id) { 
     return null; 
    } 
} 

ID extends Serializable silinen tip Serializable olduğunu İçin

.

, yöntem Object findOne(Object) çağırarak, arayüz BaseService kullanarak bu kodu sağlamak için uygulama yöntemini bulacaksınız, derleyici imza Object findOne(Object) sahip ve Object findOne(Serializable) alelade heyetinin oluşan türünü gerçekleştiren bir bridge method üretir gerektiğinde atmalarını.

Köprü yöntemini, Method örneğinde isBridge() numaralı telefonu arayarak tanımlayabilirsiniz.

Ayrıca, tür silme işleminin sonucu etkileme konusunda nasıl çalıştığını da kullanabilirsiniz.

public class BaseServiceImpl<T, ID extends Object&Serializable> 
     implements BaseService<T, ID> { 
    @Override 
    public T findOne(ID id) { 
     return null; 
    } 
} 

orada genel tür sistemi ile ilgili herhangi bir anlam fark ancak bunlarla beyan değiştirerek ID extends Object&Serializable silinmesi Object olacak, dolayısıyla, findOne yöntemin elde edilen silme arayüzü silinmesi aynı olacaktır Bu nedenle, yöntem, bu durumda, hiçbir köprü yöntemine ihtiyaç duyulmayacaktır.