标签:style blog http color java 使用 os strong
使用泛型的写法
public class A implements Comparable<B> { public int compareTo(B other) {...} }
使用raw type的写法(注意implements后面的Comparable没有带上类型参数)
public class A implements Comparable { public int compareTo(Object obj) { B other = (B) obj; ... } }
标准库的Arrays.sort的实现是接收一个Object[](不是Comparable[]),然后在实现里手动cast再调用compareTo = =!!! 像这样
if (((Comparable) a[i]).compareTo(a[j])) // 好多括号啊
所以如果传进去的数组本来就没implement Comparable,编译器也查不出来,要到运行时才会杯具……
当涉及继承的时候就会变得更加蛋疼
作者的建议是分成两种情况
如果子类对相等的定义和父类不同, 那么在所有的compareTo开头都加上这样一句
if (getClass() != other.getClass()) throw new ClassCastException();
就可以保证父类的compareTo也会按照标准说的那样抛异常,然后你就可以放心cast了
如果只是想把clone改成public的让其他类也调用,保留原来的浅拷贝特性不变,写起来大概是这样的,注意要标注异常(凡是用了clone()的函数都要标注这个或者用try...catch,一般建议只有final class来用try..catch处理,其他class标注这个异常即可)
class A implements Cloneable { public A clone() throws CloneNotSupportedException { return (A) super.clone(); } }
这段代码除了把继承自Object的clone改成了public以外啥都没干……(注意Object的clone是会复制子类实际的field的,估计用了reflection)。如果还需要干点其他的,比如进一步拷贝里面的引用,一般在clone里会先调用Object的clone,将原始类型拷贝过来,然后再对引用类型逐个调用clone:
A cloned = (A) super.clone(); cloned.b = (B) this.b.clone(); ... return cloned;
语法大概是
new SuperType(...) {...}
花括号里是inner class的定义,一般会override一些方法啥的。这句做的事包括
用来实现callback的类一般这样写
public class A implements ActionListener { // 这里可能有个构造函数啥的 public A(...) {...} // 实现actionPerformed public void actionPerformed(ActionEvent event) { // .... } } // 用法 ActionListener a = new A(...); // 然后把a传给需要callback对象的函数
匿名的inner class的话就这样写
ActionListener a = new ActionListener() { // 木有构造函数,呵呵 public void actionPerformed(ActionEvent event) { // .... } }
虽然不能有构造函数,但是匿名inner class依然可以有initialization block,而且利用initialization block还可以快速初始化ArrayList或者其他数据结构,像这样
ArrayList<String> a = new ArrayList<String>() {{ add("1"); add("2");}}
然后用的时候自动起用多态2333
匿名inner class的另一种神奇用法:在static方法里用reflection获取类的信息。因为直接调用getClass()实际上需要this指针,static方法又没有this指针,所以可以临时创建一个inner class,用getClass().getEnclosingClass()来获取这个类的信息,像这样:
new Object(){}.getClass().getEnclosingClass();
标签:style blog http color java 使用 os strong
原文地址:http://www.cnblogs.com/joyeecheung/p/3877067.html