为什么javac in ant使用不兼容的类型构建脚本错误

时间:2011-04-01 21:56:04

标签: java spring ant

我有一个使用以下消息错误的ant构建脚本。

javac incompatible types by ant build

ProductDao.java:41: incompatible types
found   : java.lang.Object
required: java.util.List<com.sample.dto.Product>
            listProductsIds = jdbc.execute("{ call find_Product_id(?,?,?,?,?) }",
                                        ^
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

但如果我在我的eclipse IDE中测试一切正常。

我正在使用Spring JdbcTemplate,这就是我定义调用的方式。

    @SuppressWarnings("unchecked")
    public List<Product> getProducts(final String parent, final String tagDesc,
            final int pageSize, final int pageNo, 
            final String userId, final int maxrowcount) {

        List<Product> listProductIds = new ArrayList<Product>();

        listProductIds = jdbc.execute("{ call find_Product_id(?,?,?,?,?) }",
                new CallableStatementCallback() {

                    public Object doInCallableStatement(
                            CallableStatement callableStatement)
                            throws SQLException, DataAccessException {
                        callableStatement.setString(1, parent);
                        callableStatement.setString(2, tagDesc);
                        callableStatement.setInt(3, pageSize);
                        callableStatement.setInt(4, pageNo);
                        callableStatement.setString(5, userId);
                        callableStatement.execute();

1 个答案:

答案 0 :(得分:4)

看起来Eclipse的编译器在这里过于宽容,并且编译它不应该做的事情,而javac(由Ant使用)更加严格。您在此处使用的jdbc.execute方法会返回Object,您无法将其分配给List

你已经删除了代码上的警告,这也没有帮助,所以你实际上忽略了告诉你错误的消息。

您需要使用泛型来帮助您,以便使用正确的返回类型:

List<Product> listProductIds = jdbc.execute(
    "{ call find_Product_id(?,?,?,?,?) }",
    new CallableStatementCallback<List<Product>>() {
        public List<Product> doInCallableStatement(CallableStatement callableStatement) throws SQLException, DataAccessException {
            ....
        }
    }
);

请注意,CallableStatementCallback的泛型类型签名与doInCallableStatement的返回类型以及listProductIds变量的类型相匹配。在这种代码中,您不需要也不应该有警告抑制。