Génériques: impossible de convertir de <la capture n ° 1-de ? s'étend de l'Objet,D> <S,D>

J'ai la classe suivante de la structure:

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);
    }

Mon Eclipse compilateur me donne l'erreur suivante:

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

Autant que je sache, tous les types génériques étendre Object, donc je ne vois pas où est le problème?

Nous nous efforçons de préserver une interface. C'est la première méthode de l'interface:

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

J'ai modifié un peu de sorte que les classes qui utilisent l'interface n'est pas affectée:

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

Fondamentalement, nous sommes cartographie des Pojo, nous avons été à l'aide de DozerMapper, mais maintenant, le principal architecte veut moment de la compilation, de la sécurité, et la DozerMapper ne l'est pas. Par exemple, si un pojo du champ est mis à jour (renommés, supprimés) nous avons besoin de mettre à jour manuellement le fichier xml, qui décrit le mappage entre les pojo (le xml est utilisé en cas de non-triviale de cartographie, par exemple, lorsque les noms des champs de la pojo ne correspondent pas complètement, ce qui est souvent le cas)

Maintenant, nous avons la copie des classes, des centaines d'entre eux, un pour chaque mappage entre les pojo est. Nous essayons d'utiliser l'Usine de Conception crépitement de retour spécifique mappeur de classe (mise en œuvre de la CopyMapper interface) basé sur le source de la classe et de la classe de destination.

  • Comment avez-vous CopyMapperFactory pour compiler?
  • Il vient de compile. Pourquoi? Pensez-vous qu'il ne devrait pas?
  • Tant pis, j'ai mal lu
  • Pourquoi avez-vous passer de la Classe<S> à tous? Ne pouvez-vous pas juste passer S?
  • Alors, je vais la lancer à un type spécifique, qui n'est pas le temps de compilation coffre-fort.
  • Pourquoi? S est à votre type spécifique. Que voulez-vous atteindre avec votre code?
  • Si vous mettez à jour un nom de champ, alors oui, vous devez également ajuster la configuration XML. Sont-ils tous linéaire jusqu'à des cartes entre deux objets Pojo avec aucune personnalisation nécessaire? Faire le Pojo ont le même nom de champ entre les deux, même après le changement de nom? Ou êtes-vous à l'aide de CustomConverter (lorsque vous devriez vraiment utiliser les DozerConverter)?
  • J'ai peut-être tort, mais un autre problème avec la Niveleuse est de la performance, nous avons des milliers de pojo est à la carte. Nous avons eu un coup d'oeil à la mise en œuvre et nous avons vu quelques triplement de boucles imbriquées lorsque le dozer passe par tous les pojo champs à l'aide de la réflexion, si nous sommes prêts à copier les classes, nous n'avons pas ce problème.
  • Je ne suis pas sûr à ce sujet. Dozer est assez performant pour ce qu'il fait; si vous avez des réclamations à propos de la vitesse, vous souhaitez utiliser un profiler pour le vérifier. Ci-dessus, vous n'avez pas tout à fait satisfait de mes questions posées - je comprends votre motivation à vouloir avoir le type de la sécurité, mais dans quelles circonstances êtes-vous essayer de l'obtenir? Ce type de cartographie faites-vous lequel vous avez absolument besoin d'elle? Sont là CustomConverters rôdant autour?

InformationsquelleAutor Daniel Rusev | 2014-11-25