Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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
从表达式的左侧派生,或者如果左侧的类型是从右侧派生的。后者是Scala中发生的情况。List List=new LinkedList()是正确的代码。你知道,我也知道。问题是(据我所知):为什么只有java编译器不理解这段代码是非常安全的?@Roman:L_Java_Generics_Java 7_Diamond Operator - Fatal编程技术网

从表达式的左侧派生,或者如果左侧的类型是从右侧派生的。后者是Scala中发生的情况。List List=new LinkedList()是正确的代码。你知道,我也知道。问题是(据我所知):为什么只有java编译器不理解这段代码是非常安全的?@Roman:L

从表达式的左侧派生,或者如果左侧的类型是从右侧派生的。后者是Scala中发生的情况。List List=new LinkedList()是正确的代码。你知道,我也知道。问题是(据我所知):为什么只有java编译器不理解这段代码是非常安全的?@Roman:L,java,generics,java-7,diamond-operator,Java,Generics,Java 7,Diamond Operator,从表达式的左侧派生,或者如果左侧的类型是从右侧派生的。后者是Scala中发生的情况。List List=new LinkedList()是正确的代码。你知道,我也知道。问题是(据我所知):为什么只有java编译器不理解这段代码是非常安全的?@Roman:List List=new LinkedList()不是正确的代码。当然,如果是的话,那就太好了!如果Java从一开始就有泛型,并且不必处理过去非泛型的泛型类型的向后兼容性,那么可能是这样的。@ColinD Java确实不需要在每一行中处理向后兼



从表达式的左侧派生,或者如果左侧的类型是从右侧派生的。后者是Scala中发生的情况。

List List=new LinkedList()
是正确的代码。你知道,我也知道。问题是(据我所知):为什么只有java编译器不理解这段代码是非常安全的?@Roman:
List List=new LinkedList()
不是正确的代码。当然,如果是的话,那就太好了!如果Java从一开始就有泛型,并且不必处理过去非泛型的泛型类型的向后兼容性,那么可能是这样的。@ColinD Java确实不需要在每一行中处理向后兼容性。在任何使用泛型的Java源文件中,应禁止使用旧的非泛型类型(如果与旧代码接口,则始终可以使用
),并且不应存在无用的菱形运算符。向后兼容性非常好,但请不要以牺牲复杂性为代价。为什么Java7不能仅仅引入
-兼容性
编译器开关,而如果没有,那么
javac
将禁止所有原始类型,并且只强制执行严格的泛型类型?这将使我们的代码不那么冗长。@Rosdi:同意,新代码中不需要原始类型。但是,我强烈希望在源文件中包含Java版本号(而不是(mis)使用命令行),请参见我的答案。我个人不喜欢使用菱形,除非您在同一行上定义和实例化
List strings=new List()
是可以的,但是如果您定义了
private List my List,然后在您用
my_list=new list()
实例化的页面的一半,那么它就不酷了!我的清单又包含了什么?哦,让我四处寻找定义。突然,钻石快捷方式的好处消失了。@rmirabelle这与:
my_list=getTheList()
有什么不同?有几种更好的方法来处理这类问题:1。使用在鼠标悬停时显示变量类型的IDE。2.使用更有意义的变量名,例如
private List strings
3。除非必须,否则不要拆分变量的声明和初始化。@Morfidon:是的,它对Java 8仍然有效。我很确定你应该得到警告。你有没有考虑过
新数组列表(另一个列表)
新数组列表(另一个列表)
(特别是当它被分配到
列表
并且
另一个列表
是一个
列表
)之间的区别?@Paul Bellora:没有。对我来说,这两个都是编译。那个有钻石的人甚至没有发出任何警告。然而,我看不出这有什么意义,你能详细解释一下吗?对不起,我解释得不太清楚。看看这两个例子之间的区别:我只是指出使用菱形运算符而不是原始类型是很重要的,至少在传入具有泛型边界的参数时是这样。实际上我没有花时间阅读ColinD的答案-他引用了几乎相同的东西。所以,如果我们要为原始类型引入一种新语法,那么对于真正需要它的几个地方,为什么不使用类似于
new@RawType List()
的东西呢。这已经是有效的Java 8语法,类型注释允许在任何需要的地方使用它,例如,
@RawType List=(@RawType List)genericMethod()。考虑到原始类型当前会创建编译器警告,除非放置了适当的
@SuppressWarnings
@RawType
将是一个合理的替代,不需要更微妙的语法。请注意,如果使用静态工厂方法,这不是问题,因为Java对方法调用进行类型推断。当您禁用警告时,它实际上是无用的…:)就像meIt一样,它已经被回答了,但是它也在Java教程中(大约在页面中间):关于这方面的文章很好;i、 保持它的一般性,你甚至不必使用那个注释。至少在Eclipse中,您可以告诉编译器不要就此发出警告,这样您就没事了……最好有注释。这里并不是每个开发人员都使用Eclipse。
List<String> list = new LinkedList<>();
List<String> list = new LinkedList();
List<String> list = new LinkedList();
List<String> list = new ArrayList();
List<String> list = new LinkedList();
List<String> strings = ... // some list that contains some strings

// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
package 7 com.example;
List<String> names = Lists.newArrayList();
import static com.google.common.collect.Lists.*;
...
List<String> names = newArrayList();
List<String> names = newArrayList("one", "two", "three");