【问题标题】:Java unchecked method invocation with ArrayList使用 ArrayList 的 Java 未经检查的方法调用
【发布时间】:2016-10-15 20:37:41
【问题描述】:

当我运行我的代码时,我会收到以下警告:

warning: [unchecked] unchecked method invocation: method addAll in interface List is applied to given types
        snakeDotlist.addAll(genFirstDots());
  required: Collection<? extends E>
  found: List
  where E is a type-variable:
    E extends Object declared in interface List

代码:

initDisplay();

    List<Sprite> snakeDotlist = new ArrayList<>();
    snakeDotlist.addAll(genFirstDots());



    Sprite tokenSprite = new Sprite((genRandomNumber(0, 64)), (genRandomNumber(0, 48)), 16, 16, "res/snakedot.png");

    while(!Display.isCloseRequested())
    {

        if (hasCollided(tokenSprite, snakeDotlist.get(0)))
        {
            tokenSprite.updateToken(true);
            snakeDotlist.get(0).score += 1;
            snakeDotlist.addAll(genNewDots((int)snakeDotlist.get(0).prev1x, (int)snakeDotlist.get(0).prev1y, (int)snakeDotlist.get(0).prev2x, (int)snakeDotlist.get(0).prev1y));
        }

.

 public static List genFirstDots()
{
    List<Sprite> list = new ArrayList<>();
    list.add(new Sprite(3, 0, 16, 16, "res/snakedot.png"));
    list.add(new Sprite(2, 0, 16, 16, "res/snakedot.png"));
    list.add(new Sprite(1, 0, 16, 16, "res/snakedot.png"));
    list.add(new Sprite(0, 0, 16, 16, "res/snakedot.png"));
    return list;
}

我查看了一些其他帖子,说要从

更改snakeDotList 的声明
List<Sprite> snakeDotlist = new ArrayList<Sprite>();

List<Sprite> snakeDotlist = new ArrayList<>();

但我仍然收到警告消息,但我不知道如何解决它,有什么帮助吗?

【问题讨论】:

  • 只是猜测,但尝试将genFirstDots() 的返回值从List 更改为List&lt;Sprite&gt;

标签: java arraylist warnings


【解决方案1】:

你应该改变这个:

public static List genFirstDots()

到这里:

public static List<Sprite> genFirstDots()

出现警告的原因是因为您在genFirstDots() 中返回了List,但是您将返回的值添加到List&lt;Sprite&gt;

当没有给出泛型类型参数时,泛型类型隐含一个Object 类型参数,所以List 实际上是List&lt;Object&gt;。当您尝试将对象列表附加到精灵列表时,对象列表存储的对象可能与Sprite 不兼容,并且无法添加到精灵列表中。因此发出警告。

【讨论】:

  • 这行得通,谢谢!没有意识到我需要指定它返回的列表类型。
  • 如果您认为我的回答回答了您的问题,请考虑通过单击该复选标记接受它! @海绵宝宝
【解决方案2】:

您(仅)需要将genFirstDots() 的声明从

public static List genFirstDots()

public static List<Sprite> genFirstDots()

编译器告诉您它需要一个类型化的集合,但只找到了一个通用的List

旁注:

List<Sprite> snakeDotlist = new ArrayList<>();

这就是所谓的diamond operator,它是随 Java 7 引入的,允许您跳过 Sprite 的重复声明。它确实改变了snakeDotlist 将成为List&lt;Sprite&gt; 的事实。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多