![](/img/trans.png)
[英](java.lang.String) cannot be applied to (java.lang.Object)
[英]Method cannot be applied to java.lang.Object (should accept object of specific class as argument)
我正在尝试使用我的Android应用程序中的自定义方法从对象的内容中获取字符串。 该对象是Game
类的一个实例,包含在arraylist
:
public class Game {
private static List<Game> games = new ArrayList<Game>();
private String teamName1;
private String teamName2;
private int goalsP1;
private int goalsP2;
private String result;
public Game(String teamName1, String teamName2, int goalsP1, int goalsP2)
{
this.teamName1 = teamName1;
this.teamName2 = teamName2;
this.goalsP1 = goalsP1;
this.goalsP2 = goalsP2;
}
public static List getGames() {
return games;
}
public static void addGameToArray(Game randGame) { games.add(randGame);}
public static String getStringFromGame(Game randGame) {
randGame.result = randGame.result + randGame.teamName1 + randGame.goalsP1 + randGame.goalsP2 + randGame.teamName2;
return randGame.result;
}
在我的MainActivity
我试图调用getStringFromGame
:
Game game1 = new Game("Man City ","Real Madrid", 5 ,0);
Game.addGameToArray(game1);
String result = Game.getStringFromGame(Game.getGames().get(0));
我收到一个错误:
getStringFromGame无法应用于java.lang.Object
怎么了?
看来您正在使用getGames()
返回通用列表。
所以定义为
public static List<Game> getGames() { return games; }
一切都应该正常工作。
Java是静态类型的。 此错误消息表示为“您已将一个Object
传递给getStringFromGame
,我们知道它需要使用Game
。
您没有显示getGames
定义,但是错误消息表明您正在从中返回Object
值。 因为Game
扩展了Object
(而不是相反),所以您遇到了问题。 期望Game
将拒绝传递Object
函数。
给定get(0)
:
String result = Game.getStringFromGame(Game.getGames().get(0));
getGames()
的return type
可能是某种Collection
。 如果type
没有指定的集合中,Java的假定一切集合中的类型的Object
。 Java泛型可用于定义它的集合。 因此,而不是像这样的签名:
public List getGames() { ... }
您想要这样的东西:
public List<Game> getGames() { ... }
(请注意, List
是Collection
的子类型。如果您关心订单,请使用List
,否则应将其替换为Collection
)。
此外,它似乎表明您正在随机排列该列表的顺序。 在这种情况下,更好的解决方案是:
public Game getRandomGame() { ... }
这完全避免了泛型的问题,并使随机化保持封装状态。
更新后附录
除了未成年人,这可能会给您带来麻烦:
public class Game {
private static List<Game> games = new ArrayList<Game>();
...
public static List getGames() {
return games;
}
...
}
因为您将games
声明为static
成员字段,所以任何实例化的游戏都可能会对此进行更新。 这可能会造成混乱,并且很难快速预测。 最好将它们放在单独的类( GameLibrary
?)中,如下所示:
public class GameLibrary {
private List<Game> games = new ArrayList<Game>();
public List getGames() {
return games;
}
}
这样,使用GameLibrary
一个实例的代码无法访问GameLibrary
其他每个实例。 就目前而言, Game
任何实例化都可以修改您的private static List<Game> games
值...,这会破坏封装。
您的getGames()
方法显然返回List<Something?!>
而不是List<Game>
。 您不能将不是Game
或其子类的参数传递给getGames()
方法,因为它希望传递Game
。
只要使该方法返回List<Game>
,它就会起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.