Java 如何修复'<&燃气轮机';1.6中源级别低于1.7时不允许操作员?

Java 如何修复'<&燃气轮机';1.6中源级别低于1.7时不允许操作员?,java,android,Java,Android,我有一个Java1.6Android项目。我有一个不编译的第三方代码: import org.springframework.http.HttpEntity; //... HttpHeaders requestHeaders = new HttpHeaders(); //... new HttpEntity<>(requestHeaders); import org.springframework.http.HttpEntity; //... HttpHeaders request

我有一个Java1.6Android项目。我有一个不编译的第三方代码:

import org.springframework.http.HttpEntity;
//...
HttpHeaders requestHeaders = new HttpHeaders();
//...
new HttpEntity<>(requestHeaders);
import org.springframework.http.HttpEntity;
//...
HttpHeaders requestHeaders=新的HttpHeaders();
//...
新的HttpEntity(requestHeaders);
它表示:源级别低于1.7时不允许使用“”运算符

我不想将我的项目切换到1.7。我把那句话改成了

new HttpEntity<Object>(requestHeaders);
新的HttpEntity(requestHeaders);
它现在编译得很好

但我的修正正确吗?Java1.7如何处理空括号

更新


该新对象被传递给接受
HttpEntity
参数的函数。我理解类型推断的概念,但我不理解1.7编译器从给定的代码行推断出什么。

您缺少该行的第一部分,我确信创建HttpEntity并不是为了扔掉它(检查它保存到的引用的类型)


Java您的修复是正确的。最好使用“httpentity”的确切(通用)类型

运算符背后的思想只是在编译器可以从代码隐式推断泛型类型的地方减少冗长

如本文所述

菱形操作符减少了Java的一些冗长内容 泛型,让编译器推断构造函数的参数类型 泛型类的定义

对此类运算符的需要来自于声明泛型类型的新实例的冗长。在1.7之前的Java版本中,您必须这样定义泛型:

List<MyClass> myClassCollection = new List<MyClass>();
List myClassCollection=new List();
这显然是多余的,因为编译器可以很容易地理解对象构造中应该包含的类型

此运算符带来的另一个重大改进是返回泛型类型:

在java 1.7之前:

public List<MyClass> getMyClassCollection() {
   if(some condition) {
       return new ArrayList<MyClass>();
   } else {
       return LinkedList<MyClass>();
   }
}
public List<MyClass> getMyClassCollection() {
   if(some condition) {
       return new ArrayList<>();
   } else {
       return LinkedList<>();
   }
}
公共列表getMyClassCollection(){
如果(某些条件){
返回新的ArrayList();
}否则{
返回LinkedList();
}
}
java 1.7之后:

public List<MyClass> getMyClassCollection() {
   if(some condition) {
       return new ArrayList<MyClass>();
   } else {
       return LinkedList<MyClass>();
   }
}
public List<MyClass> getMyClassCollection() {
   if(some condition) {
       return new ArrayList<>();
   } else {
       return LinkedList<>();
   }
}
公共列表getMyClassCollection(){
如果(某些条件){
返回新的ArrayList();
}否则{
返回LinkedList();
}
}

这可能看起来很琐碎,但实际上可能存在一些流,您可以在其中保留一些这样的声明。当您想要更改代码时,巨大的优势就出现了。如果现在更改方法以返回
List
(其中
MyClassChild
扩展
MyClass
),则只需更改一个位置,而不需要更改多个位置。

菱形操作符被认为可以减少在赋值中重复键入泛型的不必要工作

而不是

ArrayList<MyClassWithThatStupidLongName> list = new ArrayList<MyClassWithThatStupidLongName>();
ArrayList list=new ArrayList();
您可以使用:

ArrayList<MyClassWithThatStupidLongName> list = new ArrayList<>();
ArrayList list=new ArrayList();

不过,这是在Java 7中引入的,因为您似乎需要为较低版本工作的代码,所以您必须重新添加所有这些泛型,如我的第一个清单所示。

您的修复几乎是正确的,而且无论如何都不危险

Object
是层次结构的根,表示“让编译器推断类型”,因此在1.7中推断的任何类型都将是
Object
的特化


看到您的更新后:
实际上意味着“通配符”,因此
对象
很好。

新对象分配到哪里?那个变量是如何定义的?@ZouZou谢谢,bit我仍然不明白1.7编译器从那一行推断出了什么。@sidgate新对象被传递给接受
HttpEntity
参数的某个函数。