将比较器对象存储在数组中
我为我的对象定义了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。 但是你可以添加X
和X
对象!
正如我之前的代码所示,我们不能使用generics创建数组,但我们可以创建没有generics的数组,并将其用作具有generics的数组。
Comparator[] comparators = new Comparator[] {NORMAL,REVERSE};
我想这是某种方式让Java告诉我们“如果你知道你在做什么,那么你可以做到这一点”