首页 > 解决方案 > 未找到 T 的类文件

问题描述

对于我的任务,我们的程序是通过命令行运行来测试的,因为它们以文件名的形式接受参数,所以我必须确保我的程序在通过命令行运行时运行。当我通过 jGrasp 和 eclipse 编译它时没有问题,但是当我尝试通过命令行编译它时,这是我得到的: Cleary.java.35: error: cannot access T Collections.sort(studentObjects, idSorter); 未找到 T 的类文件

我不知道 T 是什么,而且我从来没有在我的程序中使用过 T 作为一个类?

相关代码:

主类:

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");
        }
    }

}

学生班级:

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;
    }

}

比较器类:

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;
    }
}

我已经删除了一些似乎不需要简洁的代码......任何帮助将不胜感激!

标签: javacommand-line-argumentsclassnotfoundexception

解决方案


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

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


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

想象一下,您正在编写一个类来保存学生列表。您希望能够查询某人是否在该列表中,以及将人员添加到该列表中。目前,该课程将代表一个课程名册,以便教授可以确保没有人潜入他们的课程。下面是这个类的样子:

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

然后想象你需要在年底为员工聚会创建一个新版本的这个类,因为只有部分员工符合条件(那些通过绩效考核的员工)。

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

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

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

您最终会厌倦编写此类类似的类,因此您想创建一个可以执行所有这些功能的类。您可以使用泛型来执行此操作,以便客户端代码可以使 a PersonList<Student>to hold Students、a PersonList<Staff>to hold Staff、a PersonList<TA>to hold TAs 以及您想要的任何其他类型的类。

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

这里T是泛型类型参数。在创建 class 的实例时PersonList,您在尖括号内将类型传递给它。然后该类型替换T. 约定是使用单字母名称,例如Tfor type、Efor element、Kfor key、Vfor value 等。


推荐阅读