2010-10-07 5 views
3

Я пытаюсь реализовать интерфейс RowMapper от Spring, однако моя IDE предлагает мне вернуть объект возврата в «T», и я не понимаю, почему. Может ли кто-нибудь объяснить, что мне не хватает?Реализация интерфейса с общим типом

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

Как компилятор должен знать, что 'T' представляет' Пользователь'? Возможно, вы хотите реализовать интерфейс как «реализует RowMapper ' вместо этого? –

+0

Я думал, что компилятор узнает из экземпляра класса, то есть: новый UserMapper (); – MarkPenn

+1

Но когда вы говорите, что класс 'UserMapper ', вы говорите, что для нового экземпляра можно указать любой тип. Например, 'new UserMapper ()'. Тем не менее, класс вернет «Пользователь»! – ColinD

ответ

0

Потому что T! = Пользователь.

3

Попробуйте

public class UserMapper implements RowMapper<User> { 
+0

Почему это не UserMapper ? – MarkPenn

+0

Поскольку общий атрибут применяется только к RowMapper. – duffymo

+0

Поскольку RowMapper хочет знать тип, но UserMapper предназначен только для этого типа. Поэтому UserMapper сообщает RowMapper, «это мой тип». Но никто не может сообщить UserMapper, что это за тип - он уже знает это. –

10

Если строка карты для пользователя, то он должен быть RowMapper<User>

т.е.


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

компилятор ничего не знает о Т. не знаю, поэтому, он просит вас наложить User на номер T. Если вы планируете использовать T только как тип User, вы можете использовать следующее, чтобы ограничить общий тип и предоставить компилятору больше информации.

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

Если ваш код на самом деле выглядит, что вы всегда возвращаются User, и это не зависит от T. Поэтому вы должны просто сделать тип возврата User, а не T.

Смежные вопросы