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