我在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:
我故意将importData
和validateData
分开,因为其他一些类可能只想validateData
如果事项: 我在Windows 7 x64上使用eclipse 4.3 w / Java 8
答案 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;