当前位置: 首页 > 面试题库 >

Java:从列表转换 列出 当SomeClass实现SomeInterface时

马德厚
2023-03-14
问题内容

我脑部抽筋:我有一个public interface SomeInterface和一个,static private class SomeClass并且试图List<SomeInterface>从我的方法之一返回a ,但是出现错误(在return list;下面的行中):

Type mismatch: cannot convert from List<GenericList1.SomeClass> to
List<GenericList1.SomeInterface>

如何解决此问题而无需创建新列表?

澄清:
我不希望将列表创建为List<SomeInterface>(也许是显而易见的解决方案),因为我想私下维护一个List<SomeClass>,以便将来可以访问SomeClass的方法,而不是公共接口中的方法。在下面的示例案例中没有显示,但是在我的真实程序中我需要它。

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;
    }
}

问题答案:

您应该将方法重新定义为

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

同样,其他列表声明。 只要您从 通用列表中 读取值,就可以 多态处理通用列表。

(如果要向列表中添加新元素,则应使用List<? super SomeInterface>。)

这个成语被缩写为 PECS - Producer:Extends / Consumer:Super ,由Josh Bloch在有效Java
2nd Edition,项目28中创造。

正如其他人指出的那样,因为a 并不是* a ,所以即使List<SomeClass>是,也需要这种习语。所引用文件中对此原因进行了详细说明。

*List<SomeInterface>``SomeClass implements SomeInterface



 类似资料:
  • 问题内容: ** 我定义了以下类和接口: 我有一个的对象,我需要投给的对象: 上面的最后一行导致编译错误“无法从List 强制转换为List ”。我尝试通过以下方法解决此问题: 不幸的是,这引发了。有谁知道我该如何解决? ** 问题答案: ** 您不能像那样抛弃它。创建一个新的: 构造函数采用。无论如何,它将指向相同的引用。 **

  • 问题内容: 原始列表将转换为正常。为什么原始列表的列表不能转换为的列表? 背景故事 (以减轻xy问题): 我正在使用return的API 。我碰巧知道它一直都是。我计划循环并构建自己的循环,但是我在尝试编写时试图修复(但不禁止)原始类型编译器警告。 我试过了: 但是这些会导致类型不匹配错误。 有趣的是,这没有给出警告或错误: 问题答案: // #1 (does compile) List raw

  • 问题内容: 现在,我想创建一个新列表,其中包含中的所有值。这里的结果应该包含 问题答案: 使用以下方法尝试:

  • 我有一个json 我怎么把它转换成学生名单(A,理科)(B,理科)

  • 本文向大家介绍python实现将一维列表转换为多维列表(numpy+reshape),包括了python实现将一维列表转换为多维列表(numpy+reshape)的使用技巧和注意事项,需要的朋友参考一下 如题,我们直接使用numpy 运行结果为: 这样,我们就将一维列表转换为二维列表啦,俗称列表中的列表。 以上这篇python实现将一维列表转换为多维列表(numpy+reshape)就是小编分享给

  • 问题内容: 如果我有一个,如何通过使用Java 8的功能将其转换为以相同的迭代顺序包含所有对象的? 问题答案: 你可以用于将内部列表(将它们转换为Streams之后)展平为单个Stream,然后将结果收集到列表中: