2010-10-07 6 views
3

J'essaye d'implémenter l'interface de RowMapper de Spring, cependant, mon EDI m'indique de lancer l'objet de retour à "T" et je ne comprends pas pourquoi. Quelqu'un peut-il expliquer ce que je manque?Implémentation de l'interface avec le type générique

public class UserMapper<T> implements RowMapper<T> { 
    public T mapRow(ResultSet rs, int row) throws SQLException { 
     User user = new User(); 
     user.firstName(rs.getInt("fname")); 
     user.lastName(rs.getFloat("lname")); 
     return user; // Why am I being prompted to cast this to "T", should this be fine? 
    } 
} 
+4

Comment le compilateur est censé savoir que 'T' représente' User'? Peut-être que vous voulez implémenter l'interface comme 'implémente RowMapper ' à la place? –

+0

Je pensais que le compilateur saurait à partir de l'instanciation de la classe, c'est-à-dire: new UserMapper (); – MarkPenn

+1

Mais quand vous dites que la classe est 'UserMapper ', vous dites que n'importe quel type peut être spécifié pour une nouvelle instance. Par exemple, 'new UserMapper ()'. Pourtant, la classe ne retournera jamais un utilisateur! – ColinD

Répondre

0

Parce que T! = Utilisateur.

3

Essayez

public class UserMapper implements RowMapper<User> { 
+0

Pourquoi n'est-ce pas UserMapper ? – MarkPenn

+0

Parce que le générique s'applique uniquement à RowMapper. – duffymo

+0

Parce que RowMapper veut connaître le type, mais UserMapper est seulement pour ce type. Donc UserMapper dit à RowMapper, "ceci est mon type". Mais personne d'autre n'est autorisé à dire à UserMapper quel est son type - il le sait déjà. –

10

Si une carte de ligne à un utilisateur, alors il devrait être un RowMapper<User>

-à-dire:


public class UserMapper implements RowMapper<User> { 
    public User mapRow(ResultSet rs, int row) throws SQLException { 
     User user = new User(); 
     user.firstName(rs.getInt("fname")); 
     user.lastName(rs.getFloat("lname")); 
     return user; 
    } 
} 
2

Le compilateur ne sait rien à propos de T. Par conséquent, il vous demande de lancer User à T. Si vous envisagez d'utiliser T comme un type de User, vous pouvez utiliser ce qui suit pour restreindre le type générique et donner plus d'informations au compilateur.

public class UserMapper<T extends User> implements RowMapper<T> 
... 

Si votre code ressemble vraiment comme ça, vous êtes toujours retournerez User et il ne dépend pas de T. Par conséquent, vous devriez simplement faire le type de retour User et non T.

Questions connexes