我如何将 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
一个类型。
数组列表可以存储的内容类型取决于你给它的类型。但是如果你不给它任何类型,它存储 Object
s!在这里,
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; }
}
我正在尝试从同一 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
一个类型。
数组列表可以存储的内容类型取决于你给它的类型。但是如果你不给它任何类型,它存储 Object
s!在这里,
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; }
}