我正在尝试创建一个方法,我可以在其中搜索ArrayList中的特定整数或字符串。 我已经设法让它在ArrayList中搜索整数,但是当我试图搜索字符串时,我无法正常工作。 这是我的代码:
import java.util.*;
public class Search <T> {
public static void main(String[] argv) {
Search<T> search = new Search<T>();
ArrayList<Integer> alist = new ArrayList<Integer>();
alist.add(1);
alist.add(3);
alist.add(5);
alist.add(7);
int num = 5;
ArrayList<String> alist2 = new ArrayList<String>();
alist2.add("A");
alist2.add("B");
alist2.add("C");
alist2.add("D");
String word = "C";
System.out.println(search.linearSearch(alist, num));
System.out.println(search.linearSearch(alist2, word));
}
public int linearSearch(ArrayList<T> rrr, T wordnum) {
for (int i=0; i < rrr.size(); i++) {
if (wordnum.equals(rrr.get(i))) {
return i;
};
};
return -1;
}
}
我得到的错误是“无法对非静态类型T进行静态引用”
Search<T> search = new Search<T>();
我是仿制药的新手,我真的很感激一些帮助!
答案 0 :(得分:3)
当您声明Search
时,它必须由某个类进行参数化。
在你的情况下它是
Search<Integer> search = new Search<Integer>();//to find int
Search<String> search = new Search<String>();//to find string
假设您的Search
班级
class Search<T> {
public int linearSearch(ArrayList<T> rrr, T wordnum)...
}
答案 1 :(得分:1)
您在不正确的情况下创建Search
课程实例的方式。
Search<T> search = new Search<T>();
这不会编译。您需要在创建实例时传递实际的类型参数。那是因为你不能在静态上下文中使用类型参数。
要使用泛型方法,必须为特定类型参数创建实例。然后使用该实例调用该方法将正常工作:
Search<String> stringSearch = new Search<String>();
search.linearSearch(alist2, word); // Type `T` is now String.
同样,您必须为Integer
执行此操作。
话虽如此,你并不需要让你的Search
类具有通用性。相反,您可以使方法本身具有通用性,同时使类非通用:
class Search {
/** For generic method, you define the type parameter in angular brackets,
before the return type
**/
public <T> int linearSearch(ArrayList<T> rrr, T wordnum) {
for (int i=0; i < rrr.size(); i++) {
if (wordnum.equals(rrr.get(i))) {
return i;
}
}
return -1;
}
}
然后正常创建Search
的实例,并调用此方法。将根据您传递的列表推断类型:
Search search = new Search();
System.out.println(search.linearSearch(alist, num)); // T inferred as Integer
System.out.println(search.linearSearch(alist2, word)); // T inferred as String
<强>参考文献:强>
答案 2 :(得分:0)
使类不带参数T,并使用参数T <。p>定义静态函数
public static <T> int linearSearch(List<T> rrr, T wordnum) {
因此,您可以致电Search.linearSearch(...)
。
否则@NKukhar的答案应该已经完成。 另外,在API中启用List是更好的样式(比ArrayList更通用)。