Class 找不到 T 的文件

Class File for T not found

对于我的作业,我们的程序是通过命令行 运行 对它们进行测试的,因为它们采用文件名形式的参数,所以我必须确保我的程序 运行s when 运行 通过命令行。当我通过 jGrasp 和 eclipse 毫无问题地编译它时,但是当我尝试通过命令行编译它时,这就是我得到的: Cleary.java.35:错误:无法访问 T Collections.sort(studentObjects, idSorter); class 找不到 T 的文件

我不知道 T 是什么,而且我从未在我的程序中将 T 用作 class?

相关代码:

主要Class:

package ClearyAssignment5;

import java.util.Scanner;
import java.util.ArrayList;
import java.io.*;
import java.util.*;

public class Cleary {

    public static void main(String[] args) {
        //import the input file and add each line to an ArrayList of the students
          try{
             File input = new File(args[0]);
             Scanner source = new Scanner(input);
             ArrayList<String> listOfStudents=new ArrayList<String>();
             while(source.hasNextLine()){
                listOfStudents.add(source.nextLine());
             }
             ArrayList<Student> studentObjects = new ArrayList<Student>();
             StudentIDComparator idSorter = new StudentIDComparator();
             Collections.sort(studentObjects, idSorter);
             FileWriter writer = new FileWriter(args[1]);
             PrintWriter printWriter = new PrintWriter(writer);
             for(int i=0;i<listOfStudents.size();i++){
                (studentObjects.get(i)).printStudent(printWriter);
             }
             printWriter.close();
        } catch(Exception e) {
            System.out.println("Usage: ClearyAssignment4.Cleary input_file output_file");
        }
    }

}

学生Class:

package ClearyAssignment5;

import java.io.*;
import java.util.ArrayList;
import java.lang.*;
import jva.util.*;

public class Student {
    //Initialize varaibles
    String name;
    int ID;
    float GPA;
    public Student(String studentName, int studentID, float studentGPA){
        //Take the parameters which are passed in, and set them to the variables.
        name = studentName;
        ID = studentID;
        GPA = studentGPA;
    }
       
    public int getID() {
        return ID;
    }

}

比较器Class:

package ClearyAssignment5;

import java.util.*;
import java.lang.*;
import java.io.*;

class StudentIDComparator implements Comparator<Student> {
    public int compare(Student a, Student b) {
        return a.ID - b.ID;
    }
}

为了简洁起见,我删除了一些似乎不必要的代码...任何帮助将不胜感激!

好吧,我在一个全新的目录中重写了这个程序,它编译 运行 没有问题。我不知道为什么修复它,但我想它确实如此。

TL;DR: T 是 javac 以某种方式阻塞的泛型类型参数

T 是通用类型参数的约定名称,用于 Java 的通用系统*。我不确定为什么编译器会因此而窒息,但泛型系统通常偶尔会出现一些奇怪的问题。


*对泛型的解释(如果你还没有听说过)

假设您正在编写 class 来保存学生列表。您希望能够查询某个人是否在该列表中,以及将人员添加到该列表中。现在,这个 class 将代表一个课程花名册,这样教授们就可以确保没有人偷偷进入他们的 classes。这是 class 的样子:

public class StudentList {
    public boolean isOnList(Student s) { ... }
    public void addToList(Student s) { ... }
}

然后假设你需要为年底的员工聚会创建一个新版本class,因为只有部分员工有资格(通过绩效考核的员工)。

public class StaffList {
    public boolean isOnList(Staff s) { ... }
    public void addToList(Staff s) { ... }
}

接下来,有人要求您创建此 class 的新版本以跟踪课程的助教,因为您只能将作业传递给符合条件的助教。你会创建另一个 class:

public class TAList {
    public boolean isOnList(TA t) { ... }
    public void addToList(TA t) { ... }
}

您最终会厌倦编写如此类似的 classes,因此您想创建一个可以执行所有这些功能的单个 class。您将使用泛型来这样做,以便客户端代码可以使 PersonList<Student> 保存 Students,PersonList<Staff> 保存 StaffPersonList<TA> 保存TAs,以及您想要的任何其他类型的 class。

public class PersonList<T> {
    public boolean isOnList(T t) { ... }
    public void addToList(T t) { ... }
}

这里的T是泛型类型参数。在创建 class PersonList 的实例时,您在尖括号内将类型传递给它。然后该类型将替换 T 的所有实例。约定是使用单字母命名,例如T代表类型,E代表元素,K代表键,V代表值等