【问题标题】:Method accepts List<String>, needs to return same implementation of List<String>方法接受 List<String>,需要返回 List<String> 的相同实现
【发布时间】:2018-05-10 20:15:46
【问题描述】:

我有一个方法需要接受List 的任何实现,创建一个相同实现的newList,并返回newList。我试图弄清楚如何确保newListList 的实现相同input。见附件代码:

static List<String> get(List<String> input){
  // do some stuff
  List<String> newList = new (?????);
  // do some stuff with newList
  return newList;
}

我可以重载ArrayListLinkedListVector等的方法,但我想看看是否可以在不重复一堆代码的情况下完成。

【问题讨论】:

  • 为什么需要返回相同的实现?
  • 你想要一份这份清单吗?
  • 这违反了OOP的原则。实施应该无关紧要。任何其他硬编码为特定类型 List 的地方都可能使用该接口。
  • @Compass 这就是我需要听到的。似乎如果不可能,那一定是有原因的。祝我好运,而我要推回老板类型。
  • 如果您需要针对特定​​目的针对特定实现,我会说专门为此目的创建一个方法会更合适,然后您可以调用通用版本并将其转换为方法中的具体版本。

标签: java list inheritance interface


【解决方案1】:

你可以试试这样的

static List<String> get(List<String> input){
  // do some stuff
  List<String> newList = (List<String>)input.getClass().newInstance();
  // do some stuff with newList
  return newList;
}

input.getClass() 将返回实际的运行时实现类型。

但这可能并不总是有效:

  1. 实现可能没有可访问的构造函数
  2. 可能没有无参数构造函数
  3. 你必须自己反省所有问题
  4. 还有很多我不知道的可能问题

一般来说,不要那样做。不要拘泥于执行。

【讨论】:

    【解决方案2】:

    方法重载是解决它的一种方法。 如果可能,为什么不让这个方法的用户指定列表的类型呢?

    get 方法现在也使用 Supplier&lt;List&lt;String&gt;&gt;:

    static List<String> get(List<String> input, Supplier<List<String>> listSupplier){
            // do some stuff
            List<String> newList = listSupplier.get();
            // do some stuff with newList
            return newList;
    }
    

    然后可以做:

    get(arrayList, ArrayList::new);
    get(linkedList, LinkedList::new);
    get(vector, Vector::new);
    

    【讨论】:

    • 这不适用于我目前的问题,但我会记住它,因为我会遇到可以使用它的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多