另一个非常基本的问题涉及到Java中的泛型,并直接从previous question of mine中得到。我们不是通过编写下面的代码向编译器提供了两次相同的信息吗?为什么我们既需要在左手边,也要在右手边提供两者?
List<Number> numbers = new ArrayList<Number>();编辑:正如我在一些答案中所看到的,java 7以后不再需要它了。但是我想知道在java 7之前不可能的原因是什么?
发布于 2012-08-31 13:53:15
因为pre 7不支持构造函数的泛型类型推断。这在java 7中由菱形操作符解决。
您还可以编写通用工厂方法作为解决办法,如下所示:
public static <T> List<T> createArrayList() {
return new ArrayList<T>();
}然后
List<Integer> list = createArrayList();这是有问题的,但有效。而且,对于Maps和其他多论证的泛型类型,也可能会有很好的回报。
编辑:也许语言设计人员决定不支持泛型类型推断,因为他们用类型擦除来实现泛型。另一个有问题的决定,我想.否则,不要认为在早期的java版本中存在任何反对此特性的严重原因。(彼得·劳瑞的增编中,它仍然不存在。)
发布于 2012-08-31 13:53:25
正在引入菱形操作符,以删除此冗余信息。
看看这个,所以链接以及What is the point of the diamond operator in Java 7?
根据我的阅读/理解,我认为泛型在java中做得不太好。那个?最后引入的操作符是一种痛苦的工作。擦除的事实表明,在我看来,它是有角的.它做了这项工作,但我认为这样做会好得多
发布于 2012-08-31 13:54:09
因为一个是参考,一个是实现。行的左边是设置将实例化变量存储在其中的引用。由于Java使用“运行时类型擦除”来实现泛型,因此除了引用赋值之外,没有任何代码可以知道分配了哪些泛型参数。
编辑--我不知道J7中的变化(我有点过时了:) --看起来他们解决了这个问题。
https://stackoverflow.com/questions/12216764
复制相似问题