Java 为什么类型需要定义两次?

Java 为什么类型需要定义两次?,java,generics,Java,Generics,目前这是我们定义类型的方式:在下面的case中为type-Integer。两次声明类型看起来是多余的 findmidlestack fm=new findmidlestack() 我想java应该足够聪明,允许 findmidlestack fm=new findmidlestack() 或 findmidlestack fm=new findmidlestack() 为什么他们不做简单的路由(即只定义一次类型,在左边或右边,或者声明) Java足够聪明,因为Java 7使用了: 您有一个用泛型

目前这是我们定义类型的方式:在下面的case中为type-Integer。两次声明类型看起来是多余的

findmidlestack fm=new findmidlestack()

我想java应该足够聪明,允许
findmidlestack fm=new findmidlestack()
findmidlestack fm=new findmidlestack()

为什么他们不做简单的路由(即只定义一次类型,在左边或右边,或者声明)

Java足够聪明,因为Java 7使用了:


您有一个用泛型初始化的原始类,这也会引发一个警告。但这种情况比第一种情况更糟糕,因为编译器无法检查将在
fm

中使用的泛型元素,因为这是一种特殊情况,会使语言复杂化

findmidlestack fm=…
声明一个类型为
findmidlestack
的变量,称为
fm
,初始值为
计算结果的值。它不在乎
是什么

new findmidlestack()
创建一个
findmidlestack
。它不关心如何使用
findmddlestack

在Java 7中,他们确实付出了额外的努力使之成为可能,您可以这样做:

FindMiddleStack<Integer> fm = new FindMiddleStack<>();
findmidlestack fm=new findmidlestack();

因为从语义上讲,您正在创建两个不同的东西,它们的类型恰好匹配

在左侧,您正在创建一个引用,在右侧,您正在创建一个操作符,赋值操作符将一个操作符连接到另一个操作符

此外,引用的类型可以不同于对象的类型。例如

List<? extends Number> list = new ArrayList<Integer>();

list这并不能真正回答问题。。。这不是因为您可以在声明和创建中使用不同的类型吗?@Anubian的格式不是
Collection a=new ArrayList()
(这将产生不良后果,他们在数组中犯了这个错误,我们仍在为此付费)。然而,你可以有
collection这就是它在引入泛型时的定义,你必须问设计者为什么这个问题看起来是离题的,因为它将猜测工作引入到API的原始设计者的意图中,因为这将是一个特例,并使它不是的语言复杂化。编译器只会发出警告,并通过通知使用这些方法的问题来完成其工作,但这两种情况都会编译。@LuiggiMendoza。。。什么<代码>
在Java7被证明好处大于成本之前是无效的;泛型是在Java5中引入的。这两种方法都可以使用Java5进行编译,但它们有不同的含义。这就是创建钻石运营商的动机。检查我的答案。
List List=new ArrayList()甚至在Java5中也不编译。
List
FindMiddleStack fm = new FindMiddleStack<Integer>();
FindMiddleStack<Integer> fm = new FindMiddleStack<>();
List<? extends Number> list = new ArrayList<Integer>();
List<? extends Number> list = new ArrayList<Integer>();
list = new ArrayList<>();
ArrayList<Integer> 
ArrayList<Number>