3

I have a very simple map

private Map<String,T> map = Collections.synchronizedSortedMap(new TreeMap<String,T>());

I would like to define the following method

public T[] values(){
    return (T[])map.values().toArray();
}

And obviously, I'm ending up with an unchecked cast problem... My issue is I can't invoke toArray(new T[size]).

What should I do to avoid this warning (wihtout using @SuppressedWarning)

Thanks

4

4 回答 4

4

避免数组。返回List<T>

数组是必要的基本构建块,但是它们在类型系统中非常奇怪。最好在 API 中避免使用它们。几乎任何地方都可以用 ArrayList 替换数组。性能是一样的。

于 2011-03-10T05:24:24.800 回答
1

我应该怎么做才能避免这个警告(不使用@SuppressedWarning)

这个警告是你最不应该担心的事情。更大的问题是,当它返回给期望具有特定类的数组的人时,它会因ClassCastException.

因为 Java 中的数组在运行时包含对其组件类的引用,所以在不知道类的情况下不可能构造这样的数组。要么让用户传入一些东西,然后你就可以得到类的类对象T,或者你只需​​要返回一个Object[]

于 2011-03-10T11:24:15.807 回答
0

要获得一个泛型类型的数组,您必须将一个 Class 对象传递给您的方法,否则它将返回一个 Object[] 类型的数组。

public T[] values(Class<T> cl){
    return (T[])map.values().toArray((T[])Array.newInstance(cl,0));
}

您仍然需要对此代码使用 SuppressdWarning,但它不会在运行时抛出。此外,如果您需要它来实现 collection.values() 您必须在您的 ctor 中传递该类。数组和泛型不能很好地混合,这就是为什么你应该更喜欢使用集合。

于 2011-03-10T11:43:35.017 回答
0

我能想到的最好的事情是为你的类创建一个构造函数,它接受一个类型为 T 的数组(即一个 T[] 参数)。您的班级的用户应该提供一个大小为零的数组。然后,您可以使用此数组进行 toArray(T[]) 调用。

于 2011-03-10T04:52:51.550 回答