我在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));

蚀建议我强制转换为List<?>,这并不能解决问题

有什么我想念的吗?

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

我将有许多扩展了Importable的类,它们具有不同的类型:

Importable importable;

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

}

importData(validateData(myPaths));


编辑2:

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

如果重要:
我在Windows 7 x64上使用带有Java 8的Eclipse 4.3

最佳答案

将通用参数?替换为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))
}

09-05 12:40