错误:(32,27)错误:不兼容的类型:对象无法转换为long

时间:2014-07-10 21:51:27

标签: java android

我是Java的新手。

  

错误:(40,5)错误:方法不会覆盖或实现超类型的方法
  错误:(32,27)错误:不兼容的类型:对象无法转换为长

at

    @Override
    public long getItemId(int position) {
        String item = getItem(position);
        return hashMap.get(item);
    }

完整代码如下

package com.javapapers.android.listview;

import android.content.Context;
import android.widget.ArrayAdapter;
import java.util.HashMap;
import java.util.List;

public class SimpleArrayAdapter extends ArrayAdapter {

    Context context;
    int textViewResourceId;
    private static final String TAG = "SimpleArrayAdapter" ;
    HashMap hashMap = new HashMap();

    public SimpleArrayAdapter(Context context, int textViewResourceId,
                              List objects) {
        super(context, textViewResourceId, objects);
        this.context = context;
        this.textViewResourceId = textViewResourceId;
        for (int i = 0; i < objects.size(); ++i) {
            hashMap.put(objects.get(i), i);
        }
    }

    @Override
    public long getItemId(int position) {
        String item = getItem(position);
        return hashMap.get(item);
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public void add(String object){
        hashMap.put(object,hashMap.size());
        this.notifyDataSetChanged();
    }
}

3 个答案:

答案 0 :(得分:5)

您遇到的问题源于hashMap.get(item)返回Object这一事实,但您的方法签名指定您需要返回long

public long getItemId(int position) {   // you say you will return a long
    String item = getItem(position);
    return hashMap.get(item);           // but try to return an Object
}

JVM中没有办法让自动将任意随机Object转换为long,因此编译器会给你这个错误。

有几种方法可以解决这个问题。

错误的方式

第一种(不好)的方法是施放你从地图到long的变量,如下所示:

public long getItemId(int position) {   // you say you will return a long
    String item = getItem(position);
    return (long)hashMap.get(item);     // and you return a long
}

这将使你的代码编译,但你在这里做的有效的是承诺编译器,你真的,真的确保你放在Map中的是{{{ 1}}。此时,编译器将尝试将Long拆箱到Long并将其返回。如果真的是long这会有效,如果没有,你会得到Long抛出。

正确的方式

在较新版本的Java中,有一些名为Generics的东西。使用泛型,您可以指定允许的对象类型,可以在定义时添加到容器中,如下所示:

ClassCastException

现在,编译器只允许将// create a HashMap where all keys are Objects and all values are Longs Map<Object, Long> hashMap = new HashMap<>(); public long getItemId(int position) { // you say you will return a long String item = getItem(position); return hashMap.get(item); // no cast is required } 类型的值存储在地图中,而您Long中的任何内容都将自动为get(),从而消除了需求(和铸造返回类型的危险。

答案 1 :(得分:0)

首先,你应该在你的hashmap中声明类型params,如下所示:

HashMap<String, Long> hashMap = new HashMap<String, Long>();

然后你应该能够隐式地将哈希映射值强制转换为long而没有问题。

答案 2 :(得分:0)

第一个错误告诉您函数“getItemId(int position)”在继承树中的任何其他位置都不存在(即在当前文件之上)。因此,您不希望在函数名称之前使用“@override”。

此外,您的hashmap不会声明它所拥有的数据类型。当你调用hashmap.getItem(position)时,它返回一个某种类型的对象,你的函数定义说它返回一个long,因此你需要确保你的hashmap包含long或者可以转换为long的东西,并且是从getItem返回的内容。