簡體   English   中英

如何將類對象轉換為通用對象類型?

[英]How to convert a class object to generic object type?

我正在研究一種使用NamedParameterJdbcTemplate從MySQL數據庫中獲取數據的方法。 listCurrentRecords應從數據庫返回CustomerProductSalesOrder 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表中獲取一些數據(對於ProductSalesOrder ,它們將使用它們各自的方法),如下所示:

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());

此版本通過包裝原始列表來工作。 如果你這樣做,你將無法調用任何修改列表的方法( addsetremoveclear等)。

除了在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM