java - 未找到 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;
}
}
我已经删除了一些似乎不需要简洁的代码......任何帮助将不胜感激!
解决方案
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 Student
s、a PersonList<Staff>
to hold Staff
、a PersonList<TA>
to hold TA
s 以及您想要的任何其他类型的类。
public class PersonList<T> {
public boolean isOnList(T t) { ... }
public void addToList(T t) { ... }
}
这里T
是泛型类型参数。在创建 class 的实例时PersonList
,您在尖括号内将类型传递给它。然后该类型替换T
. 约定是使用单字母名称,例如T
for type、E
for element、K
for key、V
for value 等。
推荐阅读
- python - 如何在 python 中将`str`对象转换为`datetime`对象
- sh - 如何通过 SSH 执行源(点)命令?
- postgresql - 使用 PostgreSQL plpython3u 函数返回一个表
- python - python重试重试,禁用unittest
- python - Pytorch 中的批量学习是如何进行的?
- python - 通过 Python 的 jaydebeapi 批量插入 Oracle 数据库
- http - 有什么方法可以自定义 HTTP 响应状态?
- ios - 为什么使用 SwiftUI 不显示导航标题?
- elixir - 将 UUID 列表插入原始 SQL 查询(不能使用片段)
- angular - 为什么我不能在 Ionic 4 应用程序中使用 Lottie?