-1

我正在尝试创建一种方法,可以在 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>();

我是仿制药新手,非常感谢一些帮助!

4

3 回答 3

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)...
}
于 2013-09-26T13:00:45.330 回答
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

参考:

于 2013-09-26T13:00:55.463 回答
0

制作没有参数T的类,并定义一个带参数T的静态函数。

public static <T> int linearSearch(List<T> rrr, T wordnum) {

所以你可以打电话Search.linearSearch(...)

否则@NKukhar 的回答应该已经完成​​。在 API 中启用 List 也是更好的风格(比 ArrayList 更通用)。

于 2013-09-26T13:02:30.910 回答