返回Sublclasss中的参数化类型

时间:2016-05-08 00:26:27

标签: java

我有一个类,其方法返回一个List,该类作为参数类型。我试图扩展该类,然后覆盖返回该List的方法,并将List参数化为子类。子类的返回类型与超类的返回类型不兼容。

public interface GenericReturnTypeList {

    public <T> List<T> getNames();
}

class FirstName implements GenericReturnTypeList{
    String fName;

    public List<FirstName> getNames(){
        return null;
    }
}

class FullName extends FirstName{
    String lName;

    public List<FullName> getNames(){

    }
}

有没有不同的方法来完成同样的事情?感谢

2 个答案:

答案 0 :(得分:0)

一种选择是将您的界面更改为

public interface GenericListReturn {
    public List<?> getNames();
}

这将允许实现方法返回任何类型的列表,但调用者不知道他获得了什么类型的列表。请注意,此方法可以使用协变返回类型实现:

public class FirstName implements GenericListReturn {
    @Override public List<FirstName> getNames();
}

<强>替代

或者,您可以参数化您的界面:

public interface GenericReturnTypeList<E> {
    public List<E> getNames();
}

因此实现者可以选择要返回的类型,并且调用者可以通过约束该类型参数来了解他们获得的列表类型。

因为这种类型是自我引用的,所以这变得相当笨拙,但是:

public class FirstName<F extends FirstName<F>> implements GenericReturnTypeList<F> {
    @Override public List<F> getNames();
}

public class FullName extends FirstName<FullName> {
    @Override public List<FullName> getNames();
}

在这种情况下可能不值得。

答案 1 :(得分:0)

使用通配符并转换返回的List是我最终让它工作的方式。不确定这是否是最佳做法:

public interface GenericReturnTypeList{

    public List<?> getNames();
}

class FirstName implements GenericReturnTypeList{
    String fName;

    public List<?> getNames(){
        return null;
    }
}

class FullName extends FirstName{
    String lName;

    public List<?> getNames(){
        return null;
    }

}

class NameGetter {

    public static void main(String[] args){

        GenericReturnTypeList firstN = new FirstName();
        List<FirstName> firstNList = (List<FirstName>) firstN.getNames();

        GenericReturnTypeList fullN = new FullName();
        List<FullName> fnList = (List<FullName>)fullN.getNames();

    }

}