Java通用抽象类返回类型不匹配

时间:2014-04-05 14:47:04

标签: java generics abstract-class

我在java中有一个抽象类:

private abstract class Importable<T> {

    // ...

    public abstract List<T> validateData(List<Path> paths);

    public abstract void importData(List<T> data);

    // ...

}


private static class MyImportable  extends Importable<String>{

    public List<String> validateData(List<Path> paths){
        return // valid ArrayList<String>;
    }

    public void importData(List<String> data){
        // do stuff with data
    }    

}

现在,如果我这样做:

public Importable importable;
// ...
importable = new MyImportable(); // MyImportable extends Importable<String>

调用此方法有效:

importData(validateData(myPaths));

但我不喜欢原始的Importable,所以我添加了<?>

public Importable<?> importable; 

这样做会引发错误:

The method importData(List<capture#5-of ?>) in the type ImportController.Importable<capture#5-of ?> is not applicable for the arguments (List<capture#6-of ?>)

执行importData(validateData(myPaths));

和eclipse建议我施放到List<?>,它没有解决问题

我有什么遗失的吗?

编辑:抱歉,如果我不清楚,这是实际用法

我将有许多使用不同类型扩展Importable的类:

Importable importable;

switch(condition){
case 1:
    importable= // Importable<MyType1>
break;
case 2:
    importable= // Importable<MyType2>
// ....

}

importData(validateData(myPaths)); 

EDIT2:

我故意将importDatavalidateData分开,因为其他一些类可能只想validateData

如果事项: 我在Windows 7 x64上使用eclipse 4.3 w / Java 8

2 个答案:

答案 0 :(得分:1)

将通用参数?替换为String

编辑(将编辑后的问题考虑在内):

我认为以下是更好的设计:

switch(condition){
case 1:
    validateAndImport(someImportable, paths); //Importable<MyType1>
break;
case 2:
    validateAndImport(someOtherImportable, paths); //Importable<MyType1>
}

...

<T> void validateAndImport(Importable<T> importable, List<Path> paths) {
   importable.importData(importable.validateData(myPaths))
}

答案 1 :(得分:1)

这将解决您的问题

public Importable<String> importable;
// ...
importable = new MyImportable(); // MyImportable extends Importable<String>

如您所知MyImportable extends Importable<String>


- 编辑 -

根据您更新的问题,请尝试这个

abstract class Importable<T> {

    public abstract List<T> validateData(List<Path> paths);

    public abstract void importData(List<? extends Object> list);

}

并使用

public Importable<? extends Object> importable;