繁体   English   中英

方法不能应用于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() { ... }

(请注意, ListCollection的子类型。如果您关心订单,请使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM