我如何将 java 中 class 的所有对象的值加在一起?

How do i add together values from all objects of a class in java?

我正在尝试从同一 class 下的多个对象中检索某些值。我已经使用 for each 循环遍历每个对象,并希望创建一个聚合总数,代表对象中项目的评级和成本。

我父级中的 For Each 循环 class:

for (Song songObj : Song.returnSongs()) {
    totalSongCost += Double.parseDouble(songObj.getPrice());
    totalSongRating += Integer.parseInt(songObj.getRating());
}

The Child class ArrayList 用于存储对象:

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;
}

当我编译代码时,我收到一条错误消息,指出无法将对象转换为歌曲。有没有办法解决这个问题,或者有更简单的方法来完成同样的任务?

ArrayList 是通用的 class。这意味着您可以指定要使用的 class 类型。如果你改变这个:

private static ArrayList songArray = new ArrayList();

对此:

private static ArrayList<Song> songArray = new ArrayList<Song>();

然后 ArrayList class 将了解您正在使用 Song 的实例。

编辑: 正如 Jim Garrison 指出的那样,您的 returnSongs() 方法也应该更改为以相同的方式指定 class 类型。

public static ArrayList<Song> returnSongs() { ...

如果你读过 docs,你就会知道 ArrayList 实际上是一个 generic class。这意味着你可以给 ArrayList 一个类型。

数组列表可以存储的内容类型取决于你给它的类型。但是如果你不给它任何类型,它存储 Objects!在这里,

for (Song songObj : Song.returnSongs()) {

您想从 Object 个对象的数组列表中获取 Song 个对象,这对编译器没有意义。结果,出现错误。

解决这个问题的办法当然是给数组列表一个类型,让它知道应该存储什么类型。

改变这个

private static ArrayList songArray = new ArrayList();

对此:

private static ArrayList<Song> songArray = new ArrayList<>();

并更改此:

public static ArrayList returnSongs() {

对此:

public static ArrayList<Song> returnSongs() {

Song class 负责跟踪应用程序中的所有歌曲有点不寻常。这似乎超出了 class 的责任范围,也许更适合在不同的 class 中处理,无论是在您的父 class 中还是在专门定义的新类型中。

此外,使用 List and ArrayList 等类型时要小心。正如您的编译器会警告您的那样,这些需要尖括号中的类型参数(即 List<Type>)。您应该养成解决所有编译器警告的习惯,并始终为 generic 类型(如 List)指定类型参数。在您没有正确定义类型的情况下,事情开始默认为 Object,这会导致您在此处遇到的问题。

下面是一个示例,经过重组以保留 Song class 仅用于歌曲本身的属性:

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));
    }
}

你的歌曲 class 应该是这样的:

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; }
}