Java 使用synchronizedList时键入安全警告

Java 使用synchronizedList时键入安全警告,java,eclipse,Java,Eclipse,我对类成员的定义如下: private static List abc = Collections.synchronizedList(new ArrayList()); 但Eclipse给了我一个警告: Type safety: Unchecked invocation synchronizedList(ArrayList) of the generic method synchronizedList(List<T>) of type Collections 类型安全:未选中对类

我对类成员的定义如下:

private static List abc = Collections.synchronizedList(new ArrayList());
但Eclipse给了我一个警告:

Type safety: Unchecked invocation synchronizedList(ArrayList) of the generic method synchronizedList(List<T>) of type Collections
类型安全:未选中对类型集合的泛型方法synchronizedList(List)的调用synchronizedList(ArrayList)

是否有其他方法编写此声明语句以避免警告?

您有一个原始类型警告,因为您使用的是
新ArrayList()
初始值设定项,而没有指定泛型类型

因为Java中引入了Java5

它们允许类型抽象和类型安全

当您将警告指定为以下内容时,警告将消失:

private static List<MyType> abc = Collections.synchronizedList(new ArrayList<MyType>());
private static List abc=Collections.synchronizedList(new ArrayList());

。。。其中,
MyType
是该
列表所需的泛型类型

由于使用的是
new ArrayList()
初始值设定项而未指定泛型类型,因此会出现原始类型警告

因为Java中引入了Java5

它们允许类型抽象和类型安全

当您将警告指定为以下内容时,警告将消失:

private static List<MyType> abc = Collections.synchronizedList(new ArrayList<MyType>());
private static List abc=Collections.synchronizedList(new ArrayList());

。。。其中,
MyType
是您想要用于该
列表的泛型类型

类似于这样的功能:

    private static List<String> abc = Collections.synchronizedList(new ArrayList<String>());
private static List abc=Collections.synchronizedList(new ArrayList());

用您正在使用的任何组件类型替换

类似的操作:

    private static List<String> abc = Collections.synchronizedList(new ArrayList<String>());
private static List abc=Collections.synchronizedList(new ArrayList());

用您正在使用的任何组件类型替换

不是使用原始类型的最佳实践。如果要在没有警告的情况下使用原始类型,必须在方法上方放置
@SuppressWarnings(“rawtypes”)

不是使用原始类型的最佳实践。如果要在没有警告的情况下使用原始类型,则必须将
@SuppressWarnings(“rawtypes”)
放在方法上方。

正如其他人所回答的,您可以在
列表
声明和
数组列表
构造函数中指定类型参数。因此,多亏了Java“泛型”,您必须在两个地方指定相同的类型——违反了。 类型化集合是有用的,但在某些情况下,您并不关心(甚至不知道)集合中的类型,“原始”类型的使用是完全有效和可接受的

这就是为什么我通常在Eclipse中配置我的项目来禁用该警告。您可以通过右键单击项目,选择属性,然后导航到Java编译器错误和警告来执行此操作。选中标记为“启用项目特定设置”的框,然后找到可以更改此警告的通用类型部分

如果要将此设置应用于整个工作区,请使用配置工作区设置。。。链接到对话框顶部


我相信有些人会不同意我在这个问题上的立场,但我发现坚持类型参数总是过于教条,忽视了这样一个事实,即在很多情况下,类型参数是不需要的,只是使代码混乱。

正如其他人所回答的那样,您可以在
列表
声明和
数组列表
构造函数中指定类型参数。因此,多亏了Java“泛型”,您必须在两个地方指定相同的类型——违反了。 类型化集合是有用的,但在某些情况下,您并不关心(甚至不知道)集合中的类型,“原始”类型的使用是完全有效和可接受的

这就是为什么我通常在Eclipse中配置我的项目来禁用该警告。您可以通过右键单击项目,选择属性,然后导航到Java编译器错误和警告来执行此操作。选中标记为“启用项目特定设置”的框,然后找到可以更改此警告的通用类型部分

如果要将此设置应用于整个工作区,请使用配置工作区设置。。。链接到对话框顶部


我相信有些人会不同意我在这方面的立场,但我发现坚持类型参数最好过于教条,而忽略了这样一个事实:在很多情况下,类型参数是不需要的,只是会使代码变得混乱。

谢谢。我发现了一个很好的答案来理解原始类型。所以这个答案有点偏颇,尽管写得很好。如果说不应该使用原始类型,那就是忽略类型参数的代价,并假设代码总是需要知道类型。我遇到过很多不需要类型的情况,特别是在小上下文中(比如在单个方法或测试中)。答案还假定我们总是希望/需要“老大哥”编译器来关注我们,这也不总是如此,IME。@E-Riz你激起了我的兴趣。我从来没有听说过类型参数有代价。你介意进一步解释或者分享一些可能的情况吗?代价是句法和重复。如果我实际上不关心的类型,例如,一个
列表
,必须声明一个类型(例如,
)会使代码混乱;它必须在两个地方完成(声明和构造函数调用),甚至更混乱。更不用说类型参数的语法与语言的其他部分是唯一的。这一切都增加了阅读代码时的视觉分心。而且我们都知道,大多数代码的读取量是编写量的数倍。@E-Riz嗯,由于菱形运算符和改进的类型推断,通常不必在两个地方执行,除非您不幸使用了较旧的Java版本