Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将孩子列表转换为一行中的家长列表_Java_Generics_Inheritance_Polymorphism_Java 8 - Fatal编程技术网

Java 将孩子列表转换为一行中的家长列表

Java 将孩子列表转换为一行中的家长列表,java,generics,inheritance,polymorphism,java-8,Java,Generics,Inheritance,Polymorphism,Java 8,正在将香蕉列表转换为水果列表 。。。在返回之前,我必须执行以下两个步骤: public List<Fruit> getFruits() { List<? extends Fruit> fruits = (List<? extends Fruit>) allBananas(); return (List<Fruit>) fruits; } 为避免中间步骤,可按以下方式进行: public List<Fruit> getF

正在将香蕉列表转换为水果列表

。。。在返回之前,我必须执行以下两个步骤:

public List<Fruit> getFruits() {
    List<? extends Fruit> fruits = (List<? extends Fruit>) allBananas();
    return (List<Fruit>) fruits;
}
为避免中间步骤,可按以下方式进行:

public List<Fruit> getFruits() {
    return allBananas().stream().collect(Collectors.toList());
}
但在这种情况下,我必须创建新的列表对象,这在性能方面不是很好

我想我不明白一些事情,可能做错了。 我想知道我的代码是否完全正确和安全?如果是的话,有没有更好的投球方式?如果没有-有什么不对,可以改进吗?

你可以这样做

public List<Fruit> getFruits() {
    return new ArrayList<>(allBananas());
}
所以,从列表到列表的转换在技术上总是不正确的,这就是为什么Java不允许您直接这样做

你的中间演员名单你可以

public List<Fruit> getFruits() {
    return new ArrayList<>(allBananas());
}
所以,从列表到列表的转换在技术上总是不正确的,这就是为什么Java不允许您直接这样做


您的中间转换为List除了将方法签名更改为List除了将方法签名更改为List之外,这实际上取决于您想要实现什么

如果您愿意创建列表的副本,那么我只需要使用以下内容:

public List<Fruit> getFruits() {
    return new ArrayList<>(allBananas());
}
现在,调用者除了null之外不能添加到列表中,但可以从列表中删除项

使用允许添加的列表实现,但在执行时检查每个项目是否为香蕉,例如

返回列表的不可修改视图,例如

public List<Fruit> getFruits() {
    return Collections.unmodifiableList(allBananas());
}

包括复制在内的哪个选项是合适的取决于上下文。

这实际上取决于您想要实现什么

如果您愿意创建列表的副本,那么我只需要使用以下内容:

public List<Fruit> getFruits() {
    return new ArrayList<>(allBananas());
}
现在,调用者除了null之外不能添加到列表中,但可以从列表中删除项

使用允许添加的列表实现,但在执行时检查每个项目是否为香蕉,例如

返回列表的不可修改视图,例如

public List<Fruit> getFruits() {
    return Collections.unmodifiableList(allBananas());
}

包括复制在内的哪个选项是合适的是非常依赖于上下文的。

您在第一个版本中的强制转换无论如何都是不安全的。从根本上说,列表不是列表。我们不知道这里的上下文是什么-很可能您实际上应该做的只是将签名更改为List@ytterrr当前位置我看不出这个答案与我的建议有什么关系…但我在这里建议ListRight-那么,如果有人打电话给view.addnew Apple加入该列表,你会期望发生什么?如果你提交了一个列表,他们就不能这么做。这只是一个评论,因为它不能成为一个答案——因为这个问题不够清楚,无法回答。如果你更新了你的问题,让它可以回答,我可以添加一个答案…你在第一个版本中的演员阵容是不安全的。从根本上说,列表不是列表。我们不知道这里的上下文是什么-很可能您实际上应该做的只是将签名更改为List@ytterrr当前位置我看不出这个答案与我的建议有什么关系…但我在这里建议ListRight-那么,如果有人打电话给view.addnew Apple加入该列表,你会期望发生什么?如果你提交了一个列表,他们就不能这么做。这只是一个评论,因为它不能成为一个答案——因为这个问题不够清楚,无法回答。如果你更新了你的问题,使它可以回答,我可以添加一个答案…我想你的意思是整数I=整数obj;不完全是。obj而不是废话。抱歉:。@artaxerxe再次感谢。我显然有整数的废话;在我的原始代码中,双击编辑错误的单词试图将blah更改为obj。无需为帮助您而道歉:-我想您指的是整数I=整数obj;不完全是。obj而不是废话。抱歉:。@artaxerxe再次感谢。我显然有整数的废话;在我的原始代码中,双击编辑错误的单词试图将blah更改为obj。无需为帮助您而道歉:-或返回集合。不可修改的列表所有香蕉;在一行中满足:-或返回集合。不可修改列表所有香蕉;在一行中满足:-到您的第二个安全选项,使用Collections.checkedListlist,Banana.class将确保在运行时仅将香蕉添加到列表中。但是,由于静态类型系统不知道任何关于运行时检查的信息,因此未经检查的强制转换仍然是必要的。对于第二个安全选项,使用Collections.checkedListlist,Banana.class将确保在运行时仅将Banana添加到列表中。不过,由于静态类型系统不知道任何关于运行时检查的信息,所以未经检查的强制转换仍然是必要的。
public List<Fruit> getFruits() {
    return new ArrayList<>(allBananas());
}
// Don't do this!
public List<Fruit> getFruits() {
    List<? extends Fruit> fruits = (List<? extends Fruit>) allBananas();
    return (List<Fruit>) fruits;
}
List<Banana> bananas = allBananas();
List<Fruit> fruit = getFruits();
System.out.println(bananas == fruits); // Same list
fruit.add(new Apple()); // This is fine, right?
Banana banana = bananas.get(0); // This should be fine, right?
public List<? extends Fruit> getFruits() {
    return allBananas();
}
return (List<Fruit>) Collections.checkedList(allBananas(), Banana.class);
public List<Fruit> getFruits() {
    return Collections.unmodifiableList(allBananas());
}