我正在研究一种使用NamedParameterJdbcTemplate
从MySQL数据库获取数据的方法。 listCurrentRecords
应从数据库返回Customer
,Product
和SalesOrder
的对象列表类型。 objectType
是从方法(1 || 2 || 3)中传递的参数定义的,它在类中早先定义为公共变量。
public static final int TYPE_PRODUCT = 1;
public static final int TYPE_CUSTOMER = 2;
public static final int TYPE_SALESORDER = 3;
该方法如下。
public static List<Object> listCurrentRecords(int objectType)
{
// PRODUCT
if ( objectType == 1 ){
}
//CUSTOMER
else if ( objectType == 2 ){
}
// SALESORDER
else if ( objectType == 3 ){
}
return null;
// return new ArrayList<Object>();
}
说,objectType == 2
,然后需要使用Customer
方法从getMyCustomer
表中获取一些数据(同样适用于Product
和{{1} },他们将使用他们的单独方法),如下,
SalesOrder
在public static List<Customer> getMyCustomer(){
return jdbc.query("select * from Customer", new RowMapper<Customer>() {
public Customer mapRow(ResultSet rs, int rowNum) throws SQLException {
Customer customer = new Customer();
customer.setCustomerID(rs.getString("CustomerID"));
customer.setName( rs.getString("Name"));
customer.setAddress( rs.getNString("Address"));
customer.setPhone1(rs.getNString("Phone 1"));
customer.setPhone2(rs.getNString("Phone 2"));
customer.setCreditLimit(rs.getDouble("Credit Limit"));
customer.setCurrentCredit(rs.getDouble("Current Credit"));
return customer;
}
});
内,我想调用else if ( objectType == 2 ){ }
方法并在那里获取getMyCustomer
。但是,方法List<Customer>
的返回类型为listCurrentRecords
。如何转换List<Object>
到List<Customer>
。我提供了如下伪代码,
List<Object>
我很感激如何在Java中正确编写它。
答案 0 :(得分:2)
由于您需要Object
类型(记住泛型是编译时类型检查功能),您可以使用addAll
或花费第二个List
的构造函数。像
List<Object> myCustomer = new ArrayList<>(getMyCustomer());
或强>
List<Object> al = new ArrayList<>();
// ...
al.addAll(getMyCustomer());
答案 1 :(得分:1)
我可能会这样做
List<Object> myCustomer = new ArrayList<>(getMyCustomer());
这会通过迭代原始列表来创建新列表,因此可能会很慢,具体取决于列表的大小。
如果这是一个问题,可以选择
List<Object> myCustomer = Collections.unmodifiableList(getMyCustomer());
此版本的工作原理是包装原始列表。如果您这样做,您将无法调用任何修改列表的方法(add
,set
,remove
,clear
等。
答案 2 :(得分:1)
除了在List<Object>
上构建新List<Customer>
基础的其他答案之外,您可以考虑采用另一种替代方法
您的listCurrentRecords(int objectType)
仍在您的控制之下,如果没有理由需要返回List<Object>
,您可以将其更改为public static List<?> listCurrentRecords(int objectType)
。
实际上,在返回类型中使用通配符并不是一个好主意。让我们更进一步,为什么不让listCurrentRecords
返回正确的列表呢?例如,不是传入一个整数,而是传入你想要的数据类型的Class
,例如。
public static <T> List<T> listCurrentRecords(Class<T> dataType)
因此呼叫者可以通过
接收适当的列表,例如Customer
List<Customer> = listCurrentRecords(Customer.class)