【问题标题】:Java How to make a method that accepts two list types, not at the same timeJava如何制作一个接受两种列表类型的方法,而不是同时
【发布时间】:2017-09-11 04:49:12
【问题描述】:

我有这段代码

public void write(LinkedList<Drug> list, String file) {
    try (FileOutputStream fs = new FileOutputStream(System.getProperty("user.dir") + "\\res\\" + file + ".dat"); ObjectOutputStream os = new ObjectOutputStream(fs)) {
        System.out.println("Writing File...");
        os.writeObject(list);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我想要的是使用相同的方法来编写不同对象的文件,例如

LinkedList<String> temp = new LinkedList<>();
temp.add("Something");
temp.add("Something else");
write(temp, "stringlist");

我不想只做第二种方法

public void writeSomething(LinkedList<String> list, String file) {
    try (FileOutputStream fs = new FileOutputStream(System.getProperty("user.dir") + "\\res\\" + file + ".dat"); ObjectOutputStream os = new ObjectOutputStream(fs)) {
        System.out.println("Writing File...");
        os.writeObject(list);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 仅供参考(无关): FileNotFoundExceptionIOException 的子类,因此您可以删除 catch (FileNotFoundException e)。如果没有,并且您想要相同的逻辑,您可以使用 multi-catch 合并它们:catch (IOException | SomeOtherException e)
  • 我认为你没有得到问题
  • 我的评论不是您问题的答案。这只是一个无关的评论,试图教你更好的代码。
  • @Andreas 哦,感谢您提供的信息,非常感谢!

标签: java list methods


【解决方案1】:

如前所述,字面意思回答您的问题 - 允许该方法恰好接受 2 种列表类型 - 有两种调用私有泛型方法的方法:

public void writeDrugs(LinkedList<Drug> list, String file) {
  writeGeneric(list, file);
}

public void writeStrings(LinkedList<String> list, String file) {
  writeGeneric(list, file);
}

private void writeGeneric(LinkedList<?> list, String file) {
  // Implementation here.
}

请注意,您的两个公共方法需要命名不同,否则它们将具有相同的擦除。

当然,如果你不关心它只是这两种类型,你可以简单地将writeGeneric(或任何你想调用的)方法设为public

【讨论】:

  • 老兄,希望你能像在multi-catch 语句中一样使用| 并说public &lt;E extends Drug | String&gt; void writeStrings(LinkedList&lt;E&gt; list, String file),但你只能使用&amp;。 :-(
【解决方案2】:

如果您的方法不使用存储在列表中的对象类型,那么您可以将您的方法声明如下:

public void writeSomething(LinkedList<?> list, String file)

【讨论】:

  • 另外也许值得指出List&lt;?&gt;(或Collection&lt;?&gt;,或Iterable&lt;?&gt;)可能比LinkedList&lt;?&gt;更好(尽管你需要它是Serializable,ofc)
  • @AndyTurner 你可以通过public &lt;T extends List&lt;?&gt; &amp; Serializable&gt; void write(T list, String file) 来强制执行。
  • @Andreas 是的,没错!
  • @Andreas 由于此方法不依赖于List 的任何方法,我们可以将其简化为public void write(Serializable object, String file)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2012-05-28
  • 2016-09-18
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多