将比较器对象存储在数组中

我为我的对象定义了4个比较器,如下所示:

public static Comparator comp0 = new Comparator() { @Override public int compare(mObject l, mObject r) { ...compare } }; public static Comparator comp1 = new Comparator() { @Override public int compare(mObject l, mObject r) { ...compare } }; public static Comparator comp2 = new Comparator() { @Override public int compare(mObject l, mObject r) { ...compare } }; public static Comparator comp4 = new Comparator() { @Override public int compare(mObject l, mObject r) { ...compare } }; 

现在我想用4个比较器创建一个数组,如下所示:

 public final static Comparator[] Object_comparators = { comp0, comp1, comp2, comp3}; 

但是Eclipse强调{..}之间的所有内容,就像它是一个错误。为什么它,我怎么能解决它?

您不能使用参数化generics类型创建类数组。

如果你不介意失去类型安全,你可以这样做:

 Comparator[] list = new Comparator[4]; 

但我首选的策略是使用List

 List> list = Arrays.asList(comp0, comp1, comp2, comp3); 

正如Mark Elliot所说,你不能在数组中使用generics类型。 这是因为类型擦除,而数组在运行时已知其类型。 由于类型擦除,通用类型在运行时永远不会知道。 这意味着generics在编译时非常有用,而且通过一些技巧, 您可以将Animal对象插入List

顺便说一下,如果没有指定数组的类型,就不能声明创建匿名数组,因为数组类型没有类型擦除。

因此,不允许使用generics类型创建数组,并可能导致一些意外行为。

想想看:如果你创建一个汽车数组(Car []),那么你可以将它投射到Object []。 这并不意味着您可以将对象放在该数组中,因为数组的类型在运行时仍然是已知的。 如果你试图在该数组上放一只狗,你将得到一个ArrayStoreException。


现在如果我们创建了一个数组Car[] ? 您仍然可以将其强制转换为Object []。 它的工作方式类似于Car []数组,除非在这种情况下,当你将它转换为Object []时, 你将能够在运行时放置Car类型的对象,因为通用类型是未知的!


我认为Java阻止了我们这种行为。

但你仍然可以使用一系列generics参考!

 public static void main(String[] args) { Comparator NORMAL = new Comparator() { @Override public int compare(String s, String s1) { return s.compareTo(s1); } }; Comparator REVERSE = new Comparator() { @Override public int compare(String s, String s1) { return - s.compareTo(s1); } }; Comparator[] comparators = new Comparator[] {NORMAL,REVERSE}; List strings = Arrays.asList("f","d","c","a","e","b"); TreeSet normalSet = new TreeSet(comparators[0]); normalSet.addAll(strings); for ( String s : normalSet ) { System.out.println("normal : " + s); } TreeSet reverseSet = new TreeSet(comparators[1]); reverseSet.addAll(strings); for ( String s : reverseSet ) { System.out.println("reverse : " + s); } } 

产生输出:

 normal : a normal : b normal : c normal : d normal : e normal : f reverse : f reverse : e reverse : d reverse : c reverse : b reverse : a 

所以你可以使用带有generics的数组,但Java似乎阻止你做这样的事情。

我想这是因为最初的数组合约可能是这样的:

如果你创建一个X类型的数组,你将永远不能在其中放入任何不是X的东西。如果你尝试,你将得到一个ArrayStoreException

因此,允许使用generics创建的数组会导致不同的规则,例如:

如果你创建一个X类型的数组,你将永远不能放置任何IS-NOT-AN X.如果你尝试,你将得到一个ArrayStoreException。 但是你可以添加XX对象!


正如我之前的代码所示,我们不能使用generics创建数组,但我们可以创建没有generics的数组,并将其用作具有generics的数组。

 Comparator[] comparators = new Comparator[] {NORMAL,REVERSE}; 

我想这是某种方式让Java告诉我们“如果你知道你在做什么,那么你可以做到这一点”