我是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();
}
}
答案 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返回的内容。