有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何正确地创建子类的新实例

我有几个对象是特定类(ValidateVO)的子类。所有这些都存储在我们的数据库中,在validate表上有一个类型代码。我想创建一个方法,我可以为这些类中的每一个调用它来获取相关信息。我不确定实例化的类是什么类型,或者我不知道如何正确地为此声明泛型

private List<? extends ValidateVO> getValidateSubclassByType(Class<? extends ValidateVO> clazz, String type) {
    List<? extends ValidateVO> validates = new ArrayList<>();

    StringBuilder bldValidates = new StringBuilder()
    .append("SELECT VALIDATE_ID, VALIDATE_DESCRIPTION, VALIDATE_ACTIVE ")
    .append("FROM tblVALIDATE WHERE VALIDATE_TYPE = ?");

    try (
            Connection con = dataSource.getConnection();
            PreparedStatement pstmtValidates = con.prepareStatement(bldValidates.toString());
            ) {
        pstmtValidates.setString(1, type);
        ResultSet rsWholesalerGroups = pstmtValidates.executeQuery();
        if (rsWholesalerGroups.isBeforeFirst()) {
            while (rsWholesalerGroups.next()) {
                // if I use ValidateVO here, I have a problem when I add it to the list
                ValidateVO validate = clazz.newInstance();
                validate.setId(rsWholesalerGroups.getInt("VALIDATE_ID"));
                validate.setName(rsWholesalerGroups.getString("VALIDATE_DESCRIPTION"));
                validate.setActive(rsWholesalerGroups.getString("VALIDATE_ACTIVE").equals("Y"));
                // The following is the line with the error
                // The method add(capture#2-of ? extends ValidateVO) in the type List<capture#2-of ? extends ValidateVO> is not applicable for the arguments (ValidateVO)
                validates.add(validate);
            }
        } else {
            System.out.println("No WHOLESALERS");
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    }

    return validates;
}

共 (1) 个答案

  1. # 1 楼答案

    你不需要通配符类型。该方法可以定义泛型参数,并将其用于参数和返回类型newInstance调用Class<T>返回T

    private <T extends ValidateVO> List<T> getValidateSubclassByType(Class<T> clazz, String type) {
        List<T> validates = new ArrayList<>();
    
        StringBuilder bldValidates = new StringBuilder()
                .append("SELECT VALIDATE_ID, VALIDATE_DESCRIPTION, VALIDATE_ACTIVE ")
                .append("FROM tblVALIDATE WHERE VALIDATE_TYPE = ?");
    
        try (Connection con = dataSource.getConnection();
                PreparedStatement pstmtValidates = con.prepareStatement(bldValidates.toString());) {
            pstmtValidates.setString(1, type);
            ResultSet rsWholesalerGroups = pstmtValidates.executeQuery();
            if (rsWholesalerGroups.isBeforeFirst()) {
                while (rsWholesalerGroups.next()) {
                    T validate = clazz.newInstance();
                    validate.setId(rsWholesalerGroups.getInt("VALIDATE_ID"));
                    validate.setName(rsWholesalerGroups.getString("VALIDATE_DESCRIPTION"));
                    validate.setActive(rsWholesalerGroups.getString("VALIDATE_ACTIVE").equals("Y"));
                    validates.add(validate);
                }
            } else {
                System.out.println("No WHOLESALERS");
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    
        return validates;
    }