どのように私は、メソッドに型Tを渡すことができ、それが型を推論していますか?

chrips:

以下は繰り返しが私のDataCsvLoaderで起こって見ることができます。

私は、使用中イマイチメソッドgetCsvAsMapを持っています。明らかにそれは地図を取得することかもしれないがため、すべてのTは赤...コンパイラdoesntのTがあるから出て入力することを取得する方法を知っている...それを渡すためにそこに方法は何ですか?

ハンドラとして別のクラスを作成するための唯一の方法は、具体的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:

あなたのようなルックスは、物事にオブジェクト指向の道を行っていません。同様の性質を持つクラスは、抽象化を使用する必要があります。

この問題を解決するための手順に従ってください。

  1. インターフェイスを作成IEntityし、すべてのエンティティで同じように実装します。例えば、MarkEntityとして定義することができます。
public class MarkEntity implements IEntity {
// class implementation
}
  1. 変更しgetCsvAsMap()、次へ
public Map<Integer, IEntity> getCsvAsMap(String fileName, Map<Integer, IEntity> entityMap){
}
  1. 変更EntityLoaderするクラスを
public class EntityLoader<T extends IEntity> {
// Class implementation
}

それは行う必要があります。

編集します

抽象化は、エンティティが任意の機能を共有していない場合、またはとして、不可能な場合はgetCsvMap()2番目の引数として同じ戻り値の型を返す必要があり、次の交換がうまく動作するはずです。

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=337855&siteId=1