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

3

我正在研究一种使用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,那么就需要使用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编写它。

3个回答

2

由于您需要 Object 类型(请记住,泛型是一种编译时类型检查功能),因此您可以使用 addAll 或带有第二个 List 的构造函数。就像这样:

List<Object> myCustomer = new ArrayList<>(getMyCustomer());

或者

List<Object> al = new ArrayList<>();
// ...
al.addAll(getMyCustomer());

对我来说,最后一个解决方案可行。我仍在项目中工作,稍后会提供更多反馈。 - Monica Hübner

1

我可能会这样做

List<Object> myCustomer = new ArrayList<>(getMyCustomer());

这会通过迭代原始列表创建一个新的列表,因此根据列表的大小可能会很慢。
如果这是一个问题,另一种选择是执行:
List<Object> myCustomer = Collections.unmodifiableList(getMyCustomer());

这个版本的实现是通过对原始列表进行包装。如果您采用这种方式,将无法调用修改列表的任何方法(add, set, remove, clear等)。


我不知道原因,这两个解决方案都对我无效。我使用之前的答案如下: List<Object> al = new ArrayList<>();al.addAll(getMyCustomer()); - Monica Hübner
1
哦,好的。很抱歉我的回答没有帮到你。我很高兴你找到了答案。 - Paul Boddington
没关系,我还在学习如何用Java编写完整的应用程序。实际上,之前的答案也提供了你的第一个答案。我正在使用Java 1.7,这可能与版本有关吗? - Monica Hübner
我的两个答案都适用于Java 1.7。实际上,第二个答案应该适用于Java 1.5,因为它不使用钻石<>。 - Paul Boddington

1

除了其他答案中构建一个新的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 正确地接收列表。

List<Customer> = listCurrentRecords(Customer.class)

有点离题了...你真的想继续使用这样的设计吗?它看起来不太对劲。一个超级方法,可以为你提供不相关实体的“当前记录”?... - Adrian Shum
谢谢你的回答。这些方法已经在我正在开发的应用程序中定义了,但是我很快就会测试你的解决方案。 - Monica Hübner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接