泛型和策略组件的具体实现

时间:2014-05-12 01:20:57

标签: java generics strategy-pattern

我遇到了使用泛型类型的策略组件的具体实现。

想知道是否有人可以用一个例子指出我正确的方向?

这是我正在努力的方向,但是当我声明解码方法时,我会陷入困境,因为当我创建ArrayList时它会触发List ...不足为奇。

public class CsvFormat<T,T1> implements FormatStrategy<T,T1> {


public CsvFormat(boolean header) {
    setHeader(header);

@Override
public final T decode(T1 csvData) {
    csvData = new ArrayList(); //ERROR**** 
    List<Map<String, String>> decodedData = new ArrayList<Map<String, String>>(); //turn collection into an array of maps
    if (this.hasHeader()) {
        decodeDataWithHeader(csvData, decodedData);
    } else {
        decodeDataNoHeader(csvData, decodedData);
    }
    return decodedData;
}

 private void decodeDataNoHeader(List<String> csvData, List<Map<String, String>> records) {
    int recordCount = FIRST_IDX;
    List<String> fields = null; //= Arrays.asList(csvData.get(recordCount).split(DELIM)); //turn line into a list, first record
    for (String data : csvData) { //for each unformatted string
        int delimIndex = FIRST_IDX; //reset delim
        fields = Arrays.asList(data.split(DELIM));//after header, start mapping
        records.add(new LinkedHashMap<String, String>()); //make a new map
        recordCount++;
        for (String field : fields) {
            final String KEY_ID = "Column-" + (delimIndex + RECORD_BUFFER);
            records.get(records.size() - RECORD_BUFFER).put(KEY_ID, field);
            delimIndex++;
        }
    }
}

以下是我必须要开始的内容到目前为止我能想到的唯一方法就是在没有错误的情况下实现上述目的,根据传递的对象重载解码方法。 / p>

public class CsvFormat implements FormatStrategy<
List<Map<String, String>>, List<String>> {


public CsvFormat(boolean header) {
    setHeader(header);
}


@Override
public final List<Map<String, String>> decode(List<String> csvData) {
    List<Map<String, String>> decodedData = new ArrayList<Map<String, String>>(); //turn collection into an array of maps
    if (this.hasHeader()) {
        decodeDataWithHeader(csvData, decodedData);
    } else {
        decodeDataNoHeader(csvData, decodedData);
    }
    return decodedData;
}

private void decodeDataNoHeader(List<String> csvData, List<Map<String, String>> records) {
    int recordCount = FIRST_IDX;
    List<String> fields = null; //= Arrays.asList(csvData.get(recordCount).split(DELIM)); //turn line into a list, first record
    for (String data : csvData) { //for each unformatted string
        int delimIndex = FIRST_IDX; //reset delim
        fields = Arrays.asList(data.split(DELIM));//after header, start mapping
        records.add(new LinkedHashMap<String, String>()); //make a new map
        recordCount++;
        for (String field : fields) {
            final String KEY_ID = "Column-" + (delimIndex + RECORD_BUFFER);
            records.get(records.size() - RECORD_BUFFER).put(KEY_ID, field);
            delimIndex++;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

实际上你以&#34;开头的例子是&#34;似乎完全正确。您编写了一个decode方法,需要List<String>作为输入,因此您可能会将FormatStrategy接口与该特定类型实现为T1并且输出类型T也是如此。

为什么在实际遵循模式并为您关心的每种特定具体类型创建新类时,是否会对输入和不安全铸件的负载进行运行时检查?

答案 1 :(得分:1)

您为解码数据而编写的代码将始终返回List<Map<String, String>>,并且只能使用List<String>作为输入,因此CsvFormat类没有理由拥有类型参数。所以你开始时看起来是正确的,为什么你不满意呢?