Java 如何将类型T传递给方法并让它推断类型?

Java 如何将类型T传递给方法并让它推断类型?,java,Java,下面你可以在我的DataCsvLoader中看到重复 我有一个方法getCsvAsMap,它没有被使用。所有的T都是红色的,因为很明显,虽然它可能会得到一张地图。。。编译器不知道如何从那里获取T类型…有方法传递它吗 是创建另一个类作为处理程序的唯一方法。。是否专门针对getCsvAsMap方法 真诚的, 诡计 DataCsvLoader: // // Read and cache CSVs // public Map<Integer, CourseEntity> getAllCou

下面你可以在我的DataCsvLoader中看到重复

我有一个方法getCsvAsMap,它没有被使用。所有的T都是红色的,因为很明显,虽然它可能会得到一张地图。。。编译器不知道如何从那里获取T类型…有方法传递它吗

是创建另一个类作为处理程序的唯一方法。。是否专门针对getCsvAsMap方法

真诚的, 诡计

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

看起来你没有用面向对象的方式做事。具有类似属性的类应该使用抽象

按照给定的步骤解决问题

创建一个接口,并在所有实体上实现相同的接口。例如,MarkEntity可以定义为 将getCsvAsMap更改为以下内容 这样就可以了

编辑

如果抽象是不可能的,因为实体不共享任何特性,或者如果getCsvMap应该返回与第二个参数相同的返回类型,那么下面的替换应该可以正常工作

public <T> Map<Integer, T> getCsvAsMap(String fileName, Map<Integer, T> entityMap)

看起来你没有用面向对象的方式做事。具有类似属性的类应该使用抽象

按照给定的步骤解决问题

创建一个接口,并在所有实体上实现相同的接口。例如,MarkEntity可以定义为 将getCsvAsMap更改为以下内容 这样就可以了

编辑

如果抽象是不可能的,因为实体不共享任何特性,或者如果getCsvMap应该返回与第二个参数相同的返回类型,那么下面的替换应该可以正常工作

public <T> Map<Integer, T> getCsvAsMap(String fileName, Map<Integer, T> entityMap)

为什么不只是公共映射getCsvAsMapString文件名,映射entityMap{?我认为这种映射语法对于经验不足的开发人员来说还不够熟悉,但事实上,这是最简单的解决方案。感谢所有这些响应。我必须花一些时间仔细研究它们,但看起来令人惊讶的是,为什么不仅仅是公共映射getCsvAsMapString文件名,映射entityMap{?我认为这种映射语法对于经验不足的开发人员来说还不够广为人知,但事实上,这是最简单的解决方案。Jeepers感谢所有这些回答。我必须花一些时间仔细研究它们,但看起来很惊讶谢谢你纠正我的错误,我的答案并不是很真实:非常感谢你一步一步地回答。嘿,每次都很好ept:getAllCourses\uuuuu有\uuuuuuuu映射entityMap=new HashMap;\uuuuu返回getCsvAsMapcsvPath,entityMap;\uuuuuu,返回语句entityMap\uuuuuu上的红色表示需要映射!!但是CourseEntity是一个Entity!发生了什么事你在CourseEntity上实现了接口了吗?你必须用entityMap替换公共Map getAllCourses作为GetCsVasReturns映射。即使CourseEntity是一个entity,您当前的返回类型也无法工作,因为getCsvAsMap还可以返回其他实体类型,如MarkEntity、TestEntity等。感谢您的更正,我的答案并不真实:非常感谢您一步一步地执行此操作。嘿,一切都很好,除了:getAllCourses\uuuuuuuuuu拥有\uuuuuuuuuuuuuu映射entityMap=new HashMap;\uuuuu return getcsvasmappcsvpath,entityMap;\uuuuuu及其返回语句上的红色entityMap\uuuu表示需要映射!!但是CourseEntity是一个Entity!发生了什么事您在CourseEntity上实现了接口了吗?您必须将公共Map getAllCourses替换为entityMap,因为getCsvAsMap返回Map。即使这样,您当前的返回类型也无法工作CourseEntity是一个entity,因为getCsvAsMap还可以返回其他实体类型,如MarkEntity、TestEntity等。
public class EntityLoader<T extends IEntity> {
// Class implementation
}
public <T> Map<Integer, T> getCsvAsMap(String fileName, Map<Integer, T> entityMap)