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>
保存 Student
s,PersonList<Staff>
保存 Staff
,PersonList<TA>
保存TA
s,以及您想要的任何其他类型的 class。
public class PersonList<T> {
public boolean isOnList(T t) { ... }
public void addToList(T t) { ... }
}
这里的T
是泛型类型参数。在创建 class PersonList
的实例时,您在尖括号内将类型传递给它。然后该类型将替换 T
的所有实例。约定是使用单字母命名,例如T
代表类型,E
代表元素,K
代表键,V
代表值等
对于我的作业,我们的程序是通过命令行 运行 对它们进行测试的,因为它们采用文件名形式的参数,所以我必须确保我的程序 运行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>
保存 Student
s,PersonList<Staff>
保存 Staff
,PersonList<TA>
保存TA
s,以及您想要的任何其他类型的 class。
public class PersonList<T> {
public boolean isOnList(T t) { ... }
public void addToList(T t) { ... }
}
这里的T
是泛型类型参数。在创建 class PersonList
的实例时,您在尖括号内将类型传递给它。然后该类型将替换 T
的所有实例。约定是使用单字母命名,例如T
代表类型,E
代表元素,K
代表键,V
代表值等