new ArrayList()是java1.5以前不支持泛型的写法,为了保持向下兼容才保留的,现在建议指定具体的类型,也就是warning里提示的内容。
为了省事也提供了语法糖,像其他回答提到的:
List a = new ArrayList<>();
在java12中还更新了对类型推断(感谢纠正)的支持,还可以这样写:
var a = new ArrayList();
题主在评论中指出实际上warning一定有它的原因,那么编译器中认为有问题的场景是怎么样的,这两种写法我是了解的,但是为什么会有这两种不同写法,实际上一定有区别
是这样的,在加入泛型之前,这样的list是不限制类型的,你可以加入任意类型,比如加一个Integer,然后又加一个String什么的,这样的操作无论有意无意肯定会很容易出错,并且要运行之后才会抛出异常,加入泛型就是为了在编译时就明确问题,尽早发现并解决问题。
而为了让编译器明白,就必须要显式指定类型,也就是new ArrayList();
对于一个指定了类型的list:
List a = new ArrayList<>();
a.add("abc");
a.add(123); // 编译error
而对于旧代码:
List a = new ArrayList(); // 编译warning
a.add("abc"); // 编译warning
a.add(123); // 编译warning
你依旧可以加入任意类型的对象,只会有warning,像前面说的,为了兼容旧代码。