我有一个类,其方法返回一个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(){
}
}
有没有不同的方法来完成同样的事情?感谢
答案 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();
}
}