¿Cómo puedo pasar de un tipo T a un método y tenerlo inferir el tipo?

chrips:

A continuación se puede ver la repetición pasando en mi DataCsvLoader.

Tengo un método getCsvAsMap que tampoco está en uso. Todo el T son rojos porque, obviamente, si bien podría estar recibiendo una no sabe mapa ... compilador cómo conseguir que T Tipo de allí ... ¿Hay una manera de pasarlo?

Es la única manera de crear otra clase como un controlador .. específicamente para el método getCsvAsMap?

Sincrerely, 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;
}

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

Parece que no están haciendo las cosas de manera orientada a objetos. Las clases que tiene propiedades similares deben utilizar la abstracción.

Seguir los pasos dados para resolver el problema.

  1. Crear una interfaz IEntityy aplicar el mismo en todas las entidades. Por ejemplo, MarkEntityse puede definir como
public class MarkEntity implements IEntity {
// class implementation
}
  1. Cambiar la getCsvAsMap()con la siguiente
public Map<Integer, IEntity> getCsvAsMap(String fileName, Map<Integer, IEntity> entityMap){
}
  1. Cambiar la EntityLoaderclase de
public class EntityLoader<T extends IEntity> {
// Class implementation
}

Eso debería hacer.

Editar

Si la abstracción no es posible, ya que las entidades no comparten ningún elemento o si la getCsvMap()debe devolver el mismo tipo de retorno como el segundo argumento, entonces la siguiente sustitución debería funcionar bien.

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=337904&siteId=1
Recomendado
Clasificación