将多个泛型传递到Java方法

将多个泛型传递到Java方法,java,generics,arraylist,icomparable,Java,Generics,Arraylist,Icomparable,使用Java。目标是在ArrayList中搜索作为泛型给出的值,也作为泛型给出 我的学生课(相关部分) 公共班级学生实施可比 { 私有字符串名称; 私有整数平均值; 公立学生(字符串nameIn,int gradeIn) { studName=nameIn; 平均成绩=平均成绩; } 公共整数比较(对象对象对象) { 学生s1=(学生)obj; 返回(this.gradeAverage-s1.gradeAverage); } } 我的搜寻;认为通用规范可能存在问题 public class S

使用Java。目标是在ArrayList中搜索作为泛型给出的值,也作为泛型给出

我的学生课(相关部分)

公共班级学生实施可比
{
私有字符串名称;
私有整数平均值;
公立学生(字符串nameIn,int gradeIn)
{
studName=nameIn;
平均成绩=平均成绩;
}
公共整数比较(对象对象对象)
{
学生s1=(学生)obj;
返回(this.gradeAverage-s1.gradeAverage);
}
}
我的搜寻;认为通用规范可能存在问题

public class SearchMethods<T,S>
{
    public <T extends Comparable, S extends Comparable> void BinarySearch(T[] inputArray, S searchValue)
    {
        boolean found = false;
        for(int i = 0; i < inputArray.length; i++)
        {
            T search = inputArray[i];
            if(searchValue.compareTo(search) == 0)
            {
                System.out.println(searchValue + " is at index " + i);
                found = true;
            }
        }
        if(found == false)
        {
            System.out.println(searchValue + " was not found");
        }
    }    
}
公共类搜索方法
{
公共void二进制搜索(T[]输入数组,S searchValue)
{
布尔值=false;
for(int i=0;i
还有我的主要任务()

publicstaticvoidmain(字符串[]args)
{
studentOne=新生(“詹姆斯”,92岁);
学生2=新生(“玛丽”,95岁);
学生三=新生(“Bobbie”,82岁);
学生四=新生(“Emily”,100);
学生5=新生(“乔伊”,88岁);
ArrayList studentList=新建ArrayList();
studentList.add(studentOne);
添加(studentTwo);
学生名单。添加(学生三);
学生名单。添加(学生四);
学生名单。添加(学生五);
SearchMethods SearchMethods=新的SearchMethods();
searchMethods.BinarySearch(studentList,studentOne);//应打印在索引0处找到的内容
给定的编译器错误声明参数不匹配,ArrayList无法转换为T#1[]。但这就是泛型的全部要点,对吗?有趣的是,第二种类型没有给出类似的错误,但可能编译器只是没有读到那么远

我非常确定我的语法在类级别上是正确的,因此在main()中调用对象时可能会出现错误


提前感谢!

您需要将arraylist转换为数组。请检查二进制搜索的参数

试试这个:

  SearchMethods<ArrayList, Student> searchMethods = new SearchMethods<ArrayList, Student>();

    searchMethods.BinarySearch(studentList.toArray(new Student[studentList.size()]), studentOne);
 class Student<T> implements Comparable
{
private String studName;
private Integer gradeAverage;

public Student(String nameIn, int gradeIn)
{
    studName = nameIn;
    gradeAverage = gradeIn;
}

public int compareTo(Object obj)
{
    Student s1 = (Student)obj;
    if (this.gradeAverage < s1.gradeAverage){
        return -1;
    }
    if(this.gradeAverage == s1.gradeAverage){
        return 0;
    }

    return 1;
}

@Override
public String toString(){
    return "student name="+studName +" grade average= " + gradeAverage;
}
}
SearchMethods SearchMethods=新的SearchMethods();
searchMethods.BinarySearch(studentList.toArray(新学生[studentList.size()),studentOne);
您还可以更改使用arraylist的BinarySearch

虽然这不是问题的一部分,但重要的是不要计算compareTo的差值,否则会出现溢出错误

试试这个:

  SearchMethods<ArrayList, Student> searchMethods = new SearchMethods<ArrayList, Student>();

    searchMethods.BinarySearch(studentList.toArray(new Student[studentList.size()]), studentOne);
 class Student<T> implements Comparable
{
private String studName;
private Integer gradeAverage;

public Student(String nameIn, int gradeIn)
{
    studName = nameIn;
    gradeAverage = gradeIn;
}

public int compareTo(Object obj)
{
    Student s1 = (Student)obj;
    if (this.gradeAverage < s1.gradeAverage){
        return -1;
    }
    if(this.gradeAverage == s1.gradeAverage){
        return 0;
    }

    return 1;
}

@Override
public String toString(){
    return "student name="+studName +" grade average= " + gradeAverage;
}
}
班级学生实施可比较的
{
私有字符串名称;
私有整数平均值;
公立学生(字符串nameIn,int gradeIn)
{
studName=nameIn;
平均成绩=平均成绩;
}
公共整数比较(对象对象对象)
{
学生s1=(学生)obj;
如果(此.gradeAverage
1.学生中的
是什么?2.你为什么试图将类型
S
与类型T`?3.不扩展
Comparable
,最后是4.
BinarySearch
接受一个
T
数组作为第一个参数,而不是一个数组列表列表1),它试图随机地看什么是有效的。2)我没有尝试com将类型S与类型T本身进行比较,但是T[]由类型S组成。
searchValue。当您声明
searchValue
是类型
S
并且
search
是类型
T
时,
Comparable
(而不是
Comparable
)是原始类型。1.尝试“随机事件”不会让你走远的。做你理解的事情,理解你正在做的事情。2.“t[]由类型S组成”-我不知道这是什么意思,但可能不是真的将ArrayList转换为通用对象数组起了作用!!谢谢。我从周一下班后就一直在为这件事发愁。也谢谢你的比较技巧。我有一个toString覆盖,但没有包括,因为它不是主题,但我还是很感激。编辑:适用于所有对象我的其他类的测试对象也是!