Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 演员名单<;T>;为了我自己的目的_Java_Casting - Fatal编程技术网

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