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