2014-11-25 18 views
6

için Nesne, D>:Generics: <yakalama # 1'den? uzanır Ben aşağıdaki sınıf yapısına sahip <S,D>

public interface CopyMapper<S, D> { 
    public D map(S sourceObject); 
} 

public interface CopyMapperFactory { 
    public <S, D> CopyMapper<S, D> getMapper(Class<S> sourceClass, Class<D> destinationClass); 
} 

public class Mapper { 
    public <S, D> D map(S source, Class<D> destinationClass) { 
     //This is where I get compile time error 
     CopyMapper<S, D> copyMapper = mapperFactory.getMapper(source.getClass(), destinationClass); 
     return copyMapper.map(source); 
    } 

Benim Eclipse compilator bana aşağıdaki hatayı veriyor: Bildiğim kadarıyla olarak

Type mismatch: cannot convert from CopyMapper<capture#1-of ? extends Object,D> to CopyMapper<S,D> 

, tüm jenerik türleri Object uzatmak Bu yüzden sorunun nerede olduğunu görmüyorum?

Bir arabirimi korumaya çalışıyoruz. Bu arayüzün orijinal yöntemdir:

<T> T map(Object source, Class<T> destinationClass) 

bunu tweaked arayüzü kullanmak sınıflar etkilenen alamadım böylece biraz: Temel olarak, Pojo en eşleştirdiğimize

<S, D> D map(S source, Class<D> destinationClass); 

, DozerMapper'ı kullanıyoruz, ancak şimdi, büyük mimar derleme güvenliği istiyor ve DozerMapper değil. Örneğin, bir pojo alanı güncellenirse (yeniden adlandırılır, silinir), xml'i el ile güncellemeliyiz. Bu, pojo'lar arasındaki eşlemeyi açıklar (xml, nontrivial haritalama durumunda kullanılır, örneğin, pojo alanlarının adları olduğunda) Tamamen karşılık gelmez, ki bu da genellikle böyle olur)

Şimdi, pojo'lar arasındaki her bir haritalama için bir tane kopya sınıfımız var. Kaynak sınıfına ve hedef sınıfına bağlı olarak belirli bir mapper sınıfını (CopyMapper arabirimini uygulayarak) döndürmek için Factory Design şablonunu kullanmaya çalışıyoruz.

+0

Kopyalamak için 'CopyMapperFactory' nasıl oluşturdunuz? – kolossus

+0

Sadece derler. Niye ya? Sence yapmamalı mı? –

+0

Nevermind, yanlış okumuştum – kolossus

cevap

3

getClass yöntemi, beklediğinizi düşündüğünüz gibi Class<?> ve Class<S> döndürür. API'da Object#getClass'a bakın. o Class<?> döndürür gibi gerçekten bu var bu yüzden

Eğer tür bilgisi kaybetmek:

CopyMapper<?, D> copyMapper = mapperFactory.getMapper(source.getClass(), destinationClass); 

Kaynak sınıfı S yüzden güvenle bir atması eklemek düşünüyorum biliyorum ama bir uyarı alacaksınız:

CopyMapper<S, D> copyMapper = mapperFactory.getMapper((Class<S>)source.getClass(), destinationClass); 
+0

Yani bu güvenli bir dökümdür, çünkü 'kaynak' sınıfının 'S' olduğundan eminim? –

+1

Eğer bu kesinlikle bir jenerik problemiyse, haklı olduğunu düşünürdüm. Ama burada şüphe ettiğim şey, Dozer'ın kullanımıyla ilgili daha derin bir sorun olduğudur. – Makoto

İlgili konular