Java 原始类型上下文中的菱形运算符

Java 原始类型上下文中的菱形运算符,java,generics,Java,Generics,我今天看到这样的代码: public class GenClass<T> { ... } //in some other class GenClass g = new GenClass<>(); 我只是从中复制/粘贴它。它不是我的,只是发现它与答案有关 Zdeněk Troníček的实际帖子 您可能知道,即将推出的Java7的一个新特性是菱形操作符。菱形运算符的目的是简化泛型类的实例化。例如,代替 List<Integer> p = new ArrayL

我今天看到这样的代码:

public class GenClass<T> { ... }

//in some other class
GenClass g = new GenClass<>();

我只是从中复制/粘贴它。它不是我的,只是发现它与答案有关

Zdeněk Troníček的实际帖子

您可能知道,即将推出的Java7的一个新特性是菱形操作符。菱形运算符的目的是简化泛型类的实例化。例如,代替

List<Integer> p = new ArrayList<Integer>();
Java 5引入了泛型:

List<Integer> p = new ArrayList<Integer>();
以及针对该库编译的一些代码:

public class Client {
   static int f(String s) { return 1; }
   static int f(Object o) { return 2; }

   public static void main(String[] args) {
      System.out.println(f(new X("").get()));
   }
}
然后,对库进行了泛化:

public class X<T> {
   public X(T t) { }
   public T get() { return null; }
}
公共类X{
公共X(T){}
public T get(){return null;}
}
我们根据通用版本编译了客户机项目。现在,如果我们将
newx(“”
的语义更改为new
X(“”
)(或者使用菱形语法的
newx(“”
),代码的行为将不同。因此,标题问题的答案是“是”。如果我们想保持向后兼容,我们需要
,并且我们不能将
新的X(“”
在语义上等同于新的
X(“”


其他问题是Java能发展多久并保持兼容,以及Java新手是否会喜欢这一点。

钻石正在做它一直做的事情——从上下文推断泛型类型,并保证构造函数调用不会危及类型安全

考虑这个例子:

public class GenClass<T> {

    GenClass(T t, List<T> list) {}

    public static void main(String[] args) {
        GenClass m = new GenClass<>(1, new ArrayList<String>());  // Doesn't compile
    }
}
公共类GenClass{
GenClass(T,List){}
公共静态void main(字符串[]args){
GenClass m=new GenClass(1,new ArrayList());//不编译
}
}
此示例未编译,因为无法推断适当的类型。如果删除菱形,它将编译,因为构造函数参数的类型是已删除的版本(
Object
List


在您的例子中,构造函数不接受任何参数,因此没有什么真正需要检查的。但是,使用菱形是一个好习惯,即使您选择将构造函数调用的结果分配给
对象
或原始类型(不应使用原始类型)

链接会随着时间的推移而腐烂。请在这里解释你文章的相关部分。否则可能会被删除。当我发布原始链接、作者姓名并说我是从那里抄袭的时候,这怎么会是剽窃呢。如果我声称所有这些解释都属于我的话,那就是剽窃。只有当它被认为是原作者以外的人的原创思想/作品时,才是剽窃。这显然是作者的功劳,因此不是剽窃。这实际上是侵犯版权。这是在未经原作者许可的情况下使用的。虽然这提供了有趣的信息,但我认为它并没有直接解决OP的问题,从问题的措辞来看,我怀疑OP可能已经知道这篇文章写了什么。(顺便说一句,尽管它是受版权保护的材料的副本,但它可能属于“合理使用”范畴)将
GenClass g=new GenClass()
GenClass g=new GenClass()相同?@flkes是的。如果
g
是原始类型,那么您在右侧放置的类型没有区别。
class Foo<X> {
   Foo(X x) { }
   Foo<X> get(X x) { return this; }
}

class Test {
   void test() {
      Foo<?> f1 = new Foo(1).get(""); //ok - can pass String where Object is expected
      Foo<?> f2 = new Foo<>(1).get(""); //fail - cannot pass String where Integer is expected
   }
}
Foo<?> f1 = new Foo(1).get("");
public class X<T> {
   public X(T t) { }
   public T get() { return null; }

   public static int f(String s) { return 1; }
   public static int f(Object o) { return 2; }

   public static void main(String[] args) {
      System.out.println(f(new X<>("").get()));
      System.out.println(f(new X("").get()));
   }
}
public class X {
   public X(Object o) { }
   public Object get() { return null; }
}
public class Client {
   static int f(String s) { return 1; }
   static int f(Object o) { return 2; }

   public static void main(String[] args) {
      System.out.println(f(new X("").get()));
   }
}
public class X<T> {
   public X(T t) { }
   public T get() { return null; }
}
public class GenClass<T> {

    GenClass(T t, List<T> list) {}

    public static void main(String[] args) {
        GenClass m = new GenClass<>(1, new ArrayList<String>());  // Doesn't compile
    }
}