【问题标题】:Reasons to use generic List over List of object使用通用列表而不是对象列表的原因
【发布时间】:2017-02-03 15:16:12
【问题描述】:

我知道使用通用列表而不是对象列表的两个原因。

  1. 限制哪些类型的对象可以插入到列表中

    List<Object> stringObjects = Arrays.asList("a",new Integer(5));
    List<String> genericStrings = Arrays.asList("a",new Integer(5));//compile error
    
  2. 在您的 IDE 中访问正确的方法

    List<Object> stringObjects = Arrays.asList("a",new Integer(5));
    List<String> genericStrings = Arrays.asList("a");
    stringObjects.get(0).length();//compile error
    genericStrings.get(0).length();
    

当我在一次采访中给出这个答案时,但他们似乎对我的答案不太满意。 那么使用通用列表而不是对象列表还有其他原因吗?

【问题讨论】:

  • 你的标题和最后一句不一致。你问的是哪个?
  • 你是对的。我已经编辑了问题
  • 我能想到的最大的两个是不可具体化的泛型和数组的协变。然后是能够创建不可变列表、同步访问等。Effective Java 第二版第 25 条“优先使用列表而不是数组”中对此进行了非常全面的介绍。
  • 作为面试官,我会跟进您的回答,询问为什么您的第一个示例在编译时安全性方面与 Object[] stringObjects = {"a", 5}; String[] genericStrings = {"a", 5}; 有任何不同,对于您的第二个示例也是如此。

标签: java generics abstraction


【解决方案1】:

有两个主要原因:

  1. 在编译时进行更强的类型检查。

  2. 消除演员表。

source

【讨论】:

    【解决方案2】:

    在我看来,您的想法是正确的,但格式不正确。

    这不是关于“在 IDE 中访问正确的方法”,而是关于多态性和避免显式转换。

    public interface DoAble {
        void doSomething();
    }
    
    public Class FirstImpl implements DoAble {
        public void doSomething() {
            // Do something here
        }
    }
    
    public Class SecondImpl implements DoAble {
        public void doSomething() {
            // Do something here
        }
    }
    

    与对象列表一起使用

    List list = new Arrays.asList(new SecondImpl(), new FirstImple());
    for (Object o : list) {
        ((DoAble) o).doSomething();
    }
    

    它有效,但它很丑。

    • 由于可以在列表中插入任何内容,因此它可以随时抛出java.lang.ClassCastException
    • 我们需要进行显式转换,我们应该始终尽量避免。

    与通用列表一起使用

    List<DoAble> list = new Arrays.asList(new SecondImpl(), new FirstImple());
    for (DoAble o : list) {
        o.doSomething();
    }
    

    更易于使用和阅读。

    • 没有显式转换。
    • 100% 我们的列表只包含实现DoAble 的对象。

    【讨论】:

    • 你不是忘了在...Impl-Types 上实现DoAble 接口吗?
    • @MatthiasBurger 是的,完全,我修好了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 2020-07-17
    • 1970-01-01
    • 2020-12-23
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多