[英]Java generic abstract class return type mismatch
我在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));
EDIT2:
我故意將importData
和validateData
分開,因為其他一些類可能只希望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))
}
這將解決您的問題
public Importable<String> importable;
// ...
importable = new MyImportable(); // MyImportable extends Importable<String>
如您所知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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.