【问题标题】:List<List<String>> to ArrayList<List<String>>List<List<String>> 到 ArrayList<List<String>>
【发布时间】:2015-10-25 21:07:10
【问题描述】:

我很困惑...我知道我可以将 ArrayListLists 存储在 ListLists 上;

我有一个这样的对象:

SemanticTuple< List<String>, List<List<String>> > object;

我可以这样做:

List<List<String>> list = new ArrayList<>();
object = new SemanticTuple<>("name", Arrays.asList(header.split(headerSplitter)), list);

但我不能这样做:

object = new SemanticTuple<>("name", Arrays.asList(header.split(headerSplitter)), new ArrayList<>());

为什么不能识别那里的类型?

更新

public class SemanticTuple <HASH, DATA> implements Serializable {

private String name;
private HASH hash;
private DATA Data;

public SemanticTuple() {
}

public SemanticTuple(String name, HASH hash, DATA Data) {
    this.name = name;
    this.hash = hash;
    this.Data = Data;
}
...

对象被另一个类声明为泛型:

public class MeteorologicTask extends Task < LineNumberReader, 
                                         SemanticTuple< List<String>, List<List<String>> >,
                                         SemanticTuple< List<String>, List<List<String>> > >{
...

来自...

public abstract class Task <RESOURCE, INPUT, OUTPUT> implements Callable<OUTPUT>{

protected RESOURCE resource;
protected INPUT input;
protected OUTPUT output;
protected Integer taskID;

public Task() {
}

public Task(RESOURCE resource, Integer taskID) {
    this.resource = resource;
    this.taskID = taskID;
}
...

一张图片:

【问题讨论】:

  • 试试 new ArrayList>()... 我认为你必须定义对象的类型。在第一个示例中,它是隐式完成的
  • @YassinHajaj 不,仍然是错误的类型。
  • 让我们等待答案而不是:)
  • 没有足够的信息来回答这个问题。我们需要知道 a) SemanticTuple 是如何声明的,b) SemanticTuple 的构造函数是如何声明的,c) object 是如何声明的,d) 你使用的是什么版本的 Java(Java 8 有更好的类型推理)。
  • 是的...对于 Java 8 的粗略示例,这似乎很好。我怀疑您使用的是 Java 7,对吧? (我的粗略示例无法在 Java 7 上编译。)

标签: java generics arraylist


【解决方案1】:

您正在尝试创建一个新的 ArrayList 而不指定元素类型。您是否尝试过明确指定它?

SemanticTuple<List<String>, List<List<String>>> object = 
    new SemanticTuple<List<String>, List<List<String>>>(
        "name", 
        Arrays.asList(header.split(headerSplitter)), 
        new ArrayList<List<String>>()
    );

编辑:SemanticTuple 的构造函数调用中显式声明泛型类型似乎在 Java 7 中有效。

【讨论】:

  • 错误:不兼容的类型:SemanticTuple,ArrayList>> 无法转换为 SemanticTuple,List>>
  • 已更新。你能再试一次吗?
  • 显然我的平台是 java 8,因为我的平台名为 jdk 1.8,路径是:/usr/lib/jvm/java-8-oracle
  • 您是否尝试将显式类型参数也添加到构造函数调用中? (new SemanticTuple&lt;List&lt;String&gt;, List&lt;List&lt;String&gt;&gt;&gt;(…)
  • 啊,这个解决了!谢谢 :) 但为什么所有这些依赖?
【解决方案2】:

在第一种情况下,所包含元素的类型是通过详细说明赋值的左侧来推断的,即List&lt;String&gt;。因此,当您将list 作为参数传递时,它的静态类型将被明确分配。 在第二条指令中,编译器很可能断言它无法推断包含的类型,这必须在编译时决定。

【讨论】:

  • 这是不正确的,因为在 Java 8 中,这种行为就像人们期望的推理那样工作。一般来说,在这种情况下,您可能是对的,但您能否解释得更清楚一点?
  • Java 8 无法理解模棱两可的陈述,Java 18 也不会。代码没有指定列表中包含的元素的类型,并且 SemanticTuple 是通用的,因此无法在编译时进行推断。这不是广义目标类型推断的情况。
  • ... 但它在 Java 8 中运行良好,至少是粗略的例子。如果你要争论这一点,你需要引用一些资料。
  • 修改了OP,增加了object的声明。现在该声明不再模棱两可,它可以与 Java 8 以及 Java 7 一起编译。这一事实证实我们不是在谈论 Java 7 中不存在的“广义目标类型推断”。
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 2017-05-08
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 2021-03-25
  • 2018-06-11
  • 2012-10-19
相关资源
最近更新 更多