如何将类对象转换为通用对象类型?

时间:2015-11-06 02:29:38

标签: java mysql object generics jdbc

我正在研究一种使用NamedParameterJdbcTemplate从MySQL数据库获取数据的方法。 listCurrentRecords应从数据库返回CustomerProductSalesOrder的对象列表类型。 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中正确编写它。

3 个答案:

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

此版本的工作原理是包装原始列表。如果您这样做,您将无法调用任何修改列表的方法(addsetremoveclear等。

答案 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)