java:从列表转换<;SomeClass>;列出<;SomeInterface>;当SomeClass实现SomeInterface时

java:从列表转换<;SomeClass>;列出<;SomeInterface>;当SomeClass实现SomeInterface时,java,generics,Java,Generics,我的大脑抽筋了:我有一个公共接口SomeInterface和一个静态私有类SomeClass,试图从我的一个方法返回一个列表,但我得到了错误(在下面的返回列表;行上): 类型不匹配:无法从列表转换为 列表 如何在不创建新列表的情况下修复此问题 澄清:我不希望将列表创建为list(可能是显而易见的解决方案),因为私下里我想维护一个列表,以允许将来访问某个类的方法,而不仅仅是公共接口中的方法。下面的例子中没有显示这一点,但在我的实际程序中,我需要这个 import java.util.ArrayL

我的大脑抽筋了:我有一个
公共接口SomeInterface
和一个
静态私有类SomeClass
,试图从我的一个方法返回一个
列表
,但我得到了错误(在下面的
返回列表;
行上):

类型不匹配:无法从列表转换为
列表
如何在不创建新列表的情况下修复此问题

澄清:我不希望将列表创建为
list
(可能是显而易见的解决方案),因为私下里我想维护一个
列表
,以允许将来访问某个类的方法,而不仅仅是公共接口中的方法。下面的例子中没有显示这一点,但在我的实际程序中,我需要这个

import java.util.ArrayList;
import java.util.List;

public class GenericList1 {

    public interface SomeInterface
    {
        public int getX();
    }

    private static class SomeClass implements SomeInterface
    {
        final private int x;
        @Override public int getX() {
            return this.x;
        }       
        public SomeClass(int x) { this.x = x; }
    }

    public static void main(String[] args) {
        List<SomeInterface> list = createList(10);
        printList(list);
    }

    private static void printList(List<SomeInterface> list) {
        for (SomeInterface si : list)
            System.out.println(si.getX());
    }

    private static List<SomeInterface> createList(int n) {
        List<SomeClass> list = new ArrayList<SomeClass>();
        for (int i = 0; i < n; ++i)
            list.add(new SomeClass(i));
        return list;
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类GenericList1{
公共接口
{
公共int getX();
}
私有静态类SomeClass实现SomeInterface
{
最终私有INTX;
@重写公共int getX(){
归还这个.x;
}       
公共SomeClass(intx){this.x=x;}
}
公共静态void main(字符串[]args){
列表=创建列表(10);
打印列表(列表);
}
私有静态无效打印列表(列表){
对于(SomeInterface si:list)
System.out.println(si.getX());
}
私有静态列表createList(int n){
列表=新的ArrayList();
对于(int i=0;i
您应该将您的方法重新定义为

private static List<? extends SomeInterface> createList(int n) { ...

私有静态列表与流行的观点相反,
列表
列表
完全没有关系,即使
派生扩展基

类共享层次结构并不意味着它们的集合共享层次结构。一般来说,泛型也是如此

您可以按如下方式更改代码:

private static List<SomeInterface> createList(int n) {
        List<SomeInterface> list = new ArrayList<SomeInterface>();
        for (int i = 0; i < n; ++i)
            list.add(new SomeClass(i)); //add a SomeClass object - valid, because it has the interface
    return list;
}
私有静态列表createList(int n){
列表=新的ArrayList();
对于(int i=0;i
私有静态列表createList(int n){
列表=新的ArrayList();
对于(int i=0;i
我将更改方法的签名,如下所示:

private static void printList(List<? extends SomeInterface> list) {
    for (SomeInterface si : list)
        System.out.println(si.getX());
}

private static <T super SomeClass> List<T> createList(int n) {
    List<T> list = new ArrayList<T>();
    for (int i = 0; i < n; ++i)
        list.add(new SomeClass(i));
    return list;
}

private static void printList(Listyes,这是显而易见的解决方案,但我不想这样做;请看我的编辑。这是显而易见的解决方案,但我不想这样做;请看我的编辑。啊,好吧,这很有效。在我的实际程序中,我返回一个由集合包装的列表。unmodifiableList()因此,它们将是只读的。答案中有一个指向第28项的链接,但该链接现在已失效。该书的PDF可在此处获得:
private static List<SomeInterface> createList(int n) {
    List<SomeInterface> list = new ArrayList<SomeInterface>();
    for (int i = 0; i < n; ++i)
        list.add(new SomeClass(i));
    return list;
}
private static void printList(List<? extends SomeInterface> list) {
    for (SomeInterface si : list)
        System.out.println(si.getX());
}

private static <T super SomeClass> List<T> createList(int n) {
    List<T> list = new ArrayList<T>();
    for (int i = 0; i < n; ++i)
        list.add(new SomeClass(i));
    return list;
}