繁体   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