簡體   English   中英

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

[英]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:

我故意將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))
}

這將解決您的問題

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM