[英]How to convert a class object to generic object type?
我正在研究一種使用NamedParameterJdbcTemplate
從MySQL數據庫中獲取數據的方法。 listCurrentRecords
應從數據庫返回Customer
, Product
和SalesOrder
List of Objects類型。 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
,那么它將需要使用getMyCustomer
方法從Customer
表中獲取一些數據(對於Product
和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>
。 我提供了如下偽代碼,
// customer
else if ( objectType == 2 ){
List<Customer> myCustomer = getMyCustomer();
// how to convert ***myCustomer*** to List<Object> ?
}
我很感激如何在Java中正確編寫它。
由於您需要Object
類型(記住泛型是編譯時類型檢查功能),您可以使用addAll
或帶有第二個List
的構造函數。 喜歡
List<Object> myCustomer = new ArrayList<>(getMyCustomer());
要么
List<Object> al = new ArrayList<>();
// ...
al.addAll(getMyCustomer());
我可能會這樣做
List<Object> myCustomer = new ArrayList<>(getMyCustomer());
這會通過迭代原始來創建一個新列表,因此可能會很慢,具體取決於列表的大小。
如果這是一個問題,另一種方法是做
List<Object> myCustomer = Collections.unmodifiableList(getMyCustomer());
此版本通過包裝原始列表來工作。 如果你這樣做,你將無法調用任何修改列表的方法( add
, set
, remove
, clear
等)。
除了在List<Customer>
上構造新的List<Object>
基礎的其他答案之外,您可以考慮另一種替代方法
無論如何,你的listCurrentRecords(int objectType)
都在你的控制之下,如果沒有理由需要返回List<Object>
,你可以簡單地將它改為public static List<?> listCurrentRecords(int objectType)
。
實際上,在返回類型中使用通配符並不是一個好主意。 讓我們更進一步,為什么不讓listCurrentRecords
返回正確的列表呢? 例如,不是傳入一個整數,而是傳入所需數據Class
,例如
public static <T> List<T> listCurrentRecords(Class<T> dataType)
所以調用者可以收到一個適當的列表,例如, Customer
by
List<Customer> = listCurrentRecords(Customer.class)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.