Файл класса для T не найден - PullRequest
       29

Файл класса для T не найден

1 голос
/ 13 октября 2019

Для моего назначения наши программы проверяются путем запуска их через командную строку, так как они принимают аргументы в форме имен файлов, поэтому я должен убедиться, что моя программа запускается при запуске через командную строку. Когда я без проблем компилирую его с помощью jGrasp и eclipse, но когда я пытаюсь скомпилировать его с помощью командной строки, я получаю следующее: Cleary.java.35: error: не могу получить доступ к 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;
    }
}

Я удалил часть кода, который не 'Для краткости кажется необходимым ... любая помощь будет признательна!

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

TL; DR: T - это параметр общего типа, который каким-то образом захлебнулся javac

T - это обычное имя, данное параметру универсального типа, который используется для системы Generics в 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) { ... }
}

В конечном итоге вы устали от написания подобных классов, поэтому вы хотите создать один класс, который может выполнять все эти функции. Это можно сделать с помощью Generics, чтобы клиентский код мог содержать PersonList<Student> для хранения Student s, PersonList<Staff> для хранения Staff, PersonList<TA> для хранения TA s и любой другой типкласс, который вы хотите.

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

T является здесь параметром универсального типа. При создании экземпляра класса PersonList вы передаете ему тип в угловых скобках. Затем этот тип заменяет все экземпляры T. Соглашение заключается в использовании однобуквенных имен, таких как T для типа, E для элемента, K для ключа, V для значения и т. Д.

0 голосов
/ 13 октября 2019

Ну, я переписал эту программу в совершенно новый каталог, и она скомпилирована и работает без проблем. Я не знаю, почему это исправило это, но я предполагаю, что это сделало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...