Java 演员名单<;T>;为了我自己的目的
我有一个名为Java 演员名单<;T>;为了我自己的目的,java,casting,Java,Casting,我有一个名为getBillingCodes的方法,它返回名为BillingCodes的对象的列表 @Service public class BillingCodeService { private static final Logger log = LoggerFactory.getLogger(BillingCodeService.class); String sql; @Autowired private BillingCodeRowMapper bi
getBillingCodes
的方法,它返回名为BillingCodes
的对象的列表
@Service
public class BillingCodeService {
private static final Logger log = LoggerFactory.getLogger(BillingCodeService.class);
String sql;
@Autowired
private BillingCodeRowMapper billingCodeRowMapper;
@Autowired
private JdbcTemplate jdbcTemplate;
public List<BillingCode> getBillingCodes(int billingCodeId, int limit) {
sql = [SQL_STATEMENT]";
List<BillingCode> billingCodeList;
billingCodeList = jdbcTemplate.query(sql, new Object[]{billingCodeId, limit}, billingCodeRowMapper);
return billingCodeList;
}
}
然后将getBillingCodes
方法更改为:
@Service
public class BillingCodeService {
private static final Logger log = LoggerFactory.getLogger(BillingCodeService.class);
String sql;
@Autowired
private BillingCodeRowMapper billingCodeRowMapper;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private BillingCodeList billingCodeList;
public BillingCodeList getBillingCodes(int billingCodeId, int limit) {
sql = "[SQL_STATEMENT]";
billingCodeList = jdbcTemplate.query(sql, new Object[]{billingCodeId, limit}, billingCodeRowMapper);
return billingCodeList;
}
}
设置billingCodeList=jdbcTemplate.query,,。
会给我一个错误不存在变量实例,因此列表符合billingCodeList
。因此,我尝试将列表
转换为计费代码列表
,如下所示:
billingCodeList = (BillingCodeList)jdbcTemplate.query(sql, new Object[]{billingCodeId, limit}, billingCodeRowMapper);
但这给了我一个强制转换错误java.lang.ClassCastException:java.util.ArrayList不能强制转换为com.test.model.BillingCodeList
。如何将java.util.ArrayList
强制转换为com.test.model.BillingCodeList
您不能将列表强制转换为类对象。您可以做的一件事是,您可以通过构造函数将BillingCodeList对象传递给BillingCodeRowMapper,并在创建BillingCode后填充BillingCodeList。您不想做您想做的事情提问(实际上,你有一个XY问题时刻)
为了解释,我看到,BillingCodeList
用@Component
注释,我猜这意味着它是一个弹簧组件-你需要做一些非常奇特的步法来完成这项工作(这将是非常低效的)
我猜您不希望每次都重新读取所有账单代码,而是希望将它们缓存在内存中。在这种情况下,类似这样的方法会更好:
@Component
public class BillingCodeListCache {
@Autowired
private BillingCodeService billingCodeService;
private List<BillingCode> billingCodeList;
public List<BillingCode> getBillingCodes() {
if(billingCodeList == null) {
billingCodeList = billingCodeService.getBillingCodes();
}
return billingCodeList; // -- or a sublist.
}
}
@组件
公共类BillingCodeListCache{
@自动连线
私人计费代码服务计费代码服务;
私有列表计费代码列表;
公共列表getBillingCodes(){
如果(billingCodeList==null){
billingCodeList=billingCodeService.getBillingCodes();
}
返回billingCodeList;//--或子列表。
}
}
通过这种方式,您还可以控制缓存逐出。如果这样做的唯一原因是为了有一个方法打印列表的值,那么只需扩展ArrayList或在类中实现list接口即可。然后您可以重写toString方法来执行您想要的操作 我同意卢·布洛赫提出的解决方案。在BillingCodes
构造函数中将列表作为参数传递
@Autowired
private BillingCodes billingCodesToString(List<BillingCode> billingCodes) {
return new BillingCodes(billingCodes);
}
您的BillingCodeList
不是ArrayList
类型,因为它不是从ArrayList
扩展而来的,因此显然您得到了classcastection
@MehdiB。即使像扩展公共类BillingCodeList扩展ArrayList
或公共类BillingCodeList扩展ArrayList
那样进行扩展,我也会遇到相同的错误。如果没有强制转换操作符,则无法进行向下转换(缩小转换强制转换),而且这是错误的方法。你的类型BillingCodeList
(可怕的名字)只不过是一堆存放列表的代码。只需使用列表
。否则,为BillingCodes
(或您设计的更好的名称)设置一个构造函数,该构造函数将列表
作为参数,并冗余地将其复制到其内部列表中。说真的,你为什么认为你需要一个列表的包装器类型?@LewBloch:“你的类型BillingCodeList(可怕的名字)只不过是一堆保存列表的代码而已。”。这不一定是个坏主意。如果BillingCodeList是一个添加了特定功能的列表,那么通常最好创建一个自定义类型(正如OP所做的那样)并将一个列表组合到其中(类似于Efficial Java中的InsrumentedSet,J.Bloch第二版),而不是跨包边界使用继承(ArrayList不是专门为继承而设计的)。OP希望将他将支持的那些方法转发到包含的列表。@g3blv:“即使我像公共类BillingCodeList扩展ArrayList那样扩展,也会得到相同的错误”。。。无论如何,你可能不想养成这样做的习惯。ArrayList不是专门为继承而设计的。喜欢组合而不是继承。实际上,最好不要在变量名(billingCodeList
)中嵌入实现(List
)。集合通常使用复数名称来反映目的,而不是实现(billingCodes
)。这不是和列表计费代码列表一样吗;billingCodeList=jdbcTemplate.query(sql,新对象[]{billingCodeId,limit},billingCodeRowMapper)代码>?我之所以要创建对象,是因为我希望有一种方法将列表
打印到字符串
中,以便在日志中捕获它。我想创建一个带有foreach
循环的方法,而不是为返回的每个列表创建foreach
循环。
@Autowired
private BillingCodes billingCodesToString(List<BillingCode> billingCodes) {
return new BillingCodes(billingCodes);
}
billingCodesToString(billingCodes).toString()