我正在尝试从同一个类下的多个对象中检索某些值。我已经使用a for each循环来遍历每个对象,并且想要创建一个聚合总计,表示对象中项目的评级和成本。
我父类中的For Each循环:
private int rating;
private String title;
private double price;
private boolean favorite;
private static int counter = 0;
private static ArrayList songArray = new ArrayList();
/**
* Constructor for objects of class Song
*/
public Song()
{
// initialise instance variables
rating = 0;
title = "";
price = 0.0;
counter++;
songArray.add(this);
}
public static ArrayList returnSongs() {
return songArray;
}
Child类ArrayList用于存储对象:
<td data-title="'id'" sortable="'id'" filter="{ 'id': 'text' }">
{{variant.id}}
</td>
当我编译代码时,我收到一条错误消息,指出对象无法转换为歌曲。有没有办法解决这个问题,或者更简单的方法来完成相同的任务?
答案 0 :(得分:1)
如果您曾阅读docs,则会知道ArrayList
实际上是通用类。这意味着您可以为ArrayList
提供类型。
数组列表可以存储的内容类型取决于您给出的类型。但如果你不给它任何类型,它会存储Object
s!在这里,
for (Song songObj : Song.returnSongs()) {
你想从Song
个对象的数组列表中获取Object
个对象,这对编译器没有意义。结果,出现错误。
这个问题的解决方案当然是给数组列表一个类型,以便它知道它应该存储的类型。
更改此
private static ArrayList songArray = new ArrayList();
到此:
private static ArrayList<Song> songArray = new ArrayList<>();
并改变这一点:
public static ArrayList returnSongs() {
到此:
public static ArrayList<Song> returnSongs() {
答案 1 :(得分:0)
ArrayList
是一个通用类。这意味着您可以指定要使用的类类型。如果你改变了这个:
private static ArrayList songArray = new ArrayList();
到此:
private static ArrayList<Song> songArray = new ArrayList<Song>();
然后ArrayList类将理解您正在使用Song的实例。
Jim Garrison指出 编辑,还应更改returnSongs()
方法,以同样的方式指定类类型。
public static ArrayList<Song> returnSongs() { ...
答案 2 :(得分:0)
Song
班负责跟踪应用程序中的所有歌曲,这有点不寻常。这似乎不属于该类的责任,也许更适合在不同的类中处理,无论是在父类中还是在特定定义的新类型中。
此外,使用List
和ArrayList
等类型时请务必小心。由于编译器会警告您,这些需要尖括号中的类型参数(即List<Type>
)。您应该养成解决所有编译器警告的习惯,并始终为泛型类型指定类型参数,例如List
。如果您没有正确定义类型,则事情将开始默认为Object
,这会导致您遇到的问题。
下面是一个示例,它可以重新构建,以保持Song
类仅用于歌曲本身的属性:
import java.util.ArrayList;
import java.util.List;
public class Parent {
private static List<Song> songs = new ArrayList<Song>();
private static double totalSongCost = 0.0;
private static int totalSongRating = 0;
public static void main(String[] args) {
populateSongs();
for (Song song : songs) {
totalSongCost += songObj.getPrice();
totalSongRating += songObj.getRating();
}
}
private void populateSongs() {
songs.add(new Song(5, "Hey Jude", 12.5));
songs.add(new Song(4, "Angie", 11.5));
songs.add(new Song(0, "Other", 10.5));
}
}
你的歌曲课程就是这样:
public class Song {
private int rating = 0;
private String title = "";
private double price = 0.0;
public Song(int rating, String title, double price) {
this.rating = rating;
this.title = title;
this.price = price;
}
// Compressed for brevity
public int getRating() { return rating; }
public String getTitle() { return title; }
public double getPrice() { return price; }
}