如何将类型T传递给方法并使其推断类型?

chr*_*ips 1 java

在下面,您可以看到在我的DataCsvLoader中进行的重复。

我有一个没有使用的方法getCsvAsMap。所有的T都是红色的,因为很明显,虽然它可能正在获取Map。

是创建另一个类作为处理程序的唯一方法..专门用于getCsvAsMap方法吗?

辛苦地,Tricky4me

DataCsvLoader:

//
// Read and cache CSVs
//

public Map<Integer, CourseEntity> getAllCourses() {
    String csvPath = "courses.csv";
    // Create a new course Map with the right Entity type
    Map<Integer, CourseEntity> entityMap = new HashMap<>();
    repositoryInMem.put(csvPath, entityMap);
    // Get data from CSV
    EntityLoader<CourseEntity> entityLoader = new EntityLoader<>();
    entityMap = entityLoader.readCsv(csvPath);
    return entityMap;
}

public Map<Integer, StudentEntity> getAllStudents() {
    String csvPath = "students.csv";
    // Create a new course Map with the right Entity type
    Map<Integer, StudentEntity> entityMap = new HashMap<>();
    repositoryInMem.put(csvPath, entityMap);
    // Get data from CSV
    EntityLoader<StudentEntity> entityLoader = new EntityLoader<>();
    entityMap = entityLoader.readCsv(csvPath);
    return entityMap;
}

public Map<Integer, TestEntity> getAllTests() {
    String csvPath = "tests.csv";
    // Create a new course Map with the right Entity type
    Map<Integer, TestEntity> entityMap = new HashMap<>();
    repositoryInMem.put(csvPath, entityMap);
    // Get data from CSV
    EntityLoader<TestEntity> entityLoader = new EntityLoader<>();
    entityMap = entityLoader.readCsv(csvPath);
    return entityMap;
}

public Map<Integer, MarkEntity> getAllMarks() {
    String csvPath = "marks.csv";
    // Create a new course Map with the right Entity type
    Map<Integer, MarkEntity> entityMap = new HashMap<>();
    repositoryInMem.put(csvPath, entityMap);
    // Get data from CSV
    EntityLoader<MarkEntity> entityLoader = new EntityLoader<>();
    entityMap = entityLoader.readCsv(csvPath);
    return entityMap;
}


public Map<Integer, T> getCsvAsMap(String fileName, Map<Integer, T> entityMap){
    // Add the Entity map to the repository in Mem
    // The key to each entity map is just it's filename
    repositoryInMem.put(fileName, entityMap);
    // Get data from CSV
    EntityLoader<T> entityLoader = new EntityLoader<T>();
    entityMap = entityLoader.readCsv(fileName);
    return entityMap;
}
Run Code Online (Sandbox Code Playgroud)

EntityLoader:

public class EntityLoader<T> {
    public Map<Integer, T> readCsv(String csvFile){
        Map<Integer, T> table = new HashMap<>(); // Fits entire CSV table
        int rowCount=0;
        try {
            String row;
            BufferedReader csvReader = new BufferedReader(new FileReader(csvFile));
            while ((row = csvReader.readLine()) != null) {
                String[] data = row.split(",");
                table.put(rowCount++, Arrays.asList(data));
            }
            csvReader.close();
        }catch (FileNotFoundException e){
            System.err.println("No file with name " +  csvFile +
                    "Are the CSV files in the root folder? Ex: ReportCard\\courses.csv");
        }catch (IOException e) {
            System.err.println(e.getMessage());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Kal*_*ran 5

看起来您不是在执行面向对象的方法。具有相似属性的类应使用抽象。

请按照给定的步骤解决问题。

  1. 创建一个接口,IEntity并在所有实体上实现相同的接口。例如,MarkEntity可以定义为
public class MarkEntity implements IEntity {
// class implementation
}
Run Code Online (Sandbox Code Playgroud)
  1. 更改getCsvAsMap()为以下
public Map<Integer, IEntity> getCsvAsMap(String fileName, Map<Integer, IEntity> entityMap){
}
Run Code Online (Sandbox Code Playgroud)
  1. EntityLoader课程更改为
public class EntityLoader<T extends IEntity> {
// Class implementation
}
Run Code Online (Sandbox Code Playgroud)

那应该做。

编辑

如果不可能进行抽象,因为实体不共享任何功能,或者如果实体getCsvMap()应返回与第二个参数相同的返回类型,则以下替换应可以正常工作。

public <T> Map<Integer, T> getCsvAsMap(String fileName, Map<Integer, T> entityMap)
Run Code Online (Sandbox Code Playgroud)