long d = (getDelay(TimeUnit.NANOSECONDS) - other.getDelay(TimeUnit.NANOSECONDS));
第一个getDelay是调用本对象的,第二个是调用要对比的对象的.应该是调用2个对象的获取延迟方法,
返回一个延迟量D
return (d == 0) ? 0 : ((d < 0) ? -1 : 1);这个就简单了.当D大于0就返回1,小于0就返回-1,等于0就返回0
@超级pengLee: 0.0抱歉.
参数是Delayed
ScheduledFutureTask类应该继承了Delayed
就是用来对比Delayed 或继承了Delayed 的对象
@超级pengLee: 搞不懂,为什么会不能一样other是什么类型的?
public int compareTo(Delayed other)
是Delayed ,这个类是什么类型的?是ScheduledFutureTask,你小学数学老师知道你这么吊吗····
ScheduledFutureTask类应该是Delayed 的一个子类,这个是用来兼容父类的其他子类对象的
@超级pengLee: 首先,如果(other instanceof Delayed) 这才永远为真
我现在要定义一个类B,实现Delayed接口,这时候我能不能实例化一个B对象,然后放到这个public int compareTo(Delayed other) 方法里当参数?
是父类引用可以指向所有子类对象,这时候子类对象是可以不同的。你如果将一个子类引用强转成父类引用,那是永远有出异常的,但你要用父类引用强转成子类的,就需要这个父类引用本来就指向那个子类的对象,
@超级pengLee: 谁跟你说他是用来对比ScheduledFutureTask类的大小,他的参数类型是Delayed。
也就是说他可以传入一个非ScheduledFutureTask的继承或实现了Delayed的类的对象,这时候这个判断是不是会为负?就算你现在觉得你不会往里面放一个非ScheduledFutureTask类的对象,但你能保证这段代码存在的时候都没人会这样去做吗?
总的来说,这个代码既然这些写了。我猜当时程序员的意思就是为了兼容Delayed的其他子类对象的
上面这个多没什么用
这个程序的目的就是为了为通过compareTo方法来设定 ScheduledFutureTask类的对象的大小,既然这样那么这个other就肯定是
ScheduledFutureTask类的对象呀,不是吗
你自动的把参数的类型Delayed 转换成了ScheduledFutureTask,然后才有了这个问题
@超级pengLee: DelayedQueue<ScheduledFutureTask>这非常明显,是一个泛型,
泛型的目的就是为了实现代码重用也就是ScheduledFutureTask的对象是可以也应该被转换的。
你不要以(这个代码是为了实现功能A,他这样写没什么意义啊。)这种逻辑来读代码
而应该(这个代码这样写,哦。。原来可以实现功能A,但这个地方这样写有什么好处呢)这样的逻辑来读代码
@超级pengLee: 嗯,你的问题是什么?还是说Delayed接口的实现一定是ScheduledFutureTask类,然后
if (other instanceof ScheduledFutureTask)就永远为真?
@超级pengLee: 当然必须要有,API归API,代码归代码。
先不说API有没问题,在这代码这里,这一段是必须的,不然你放别的对象进去怎么办,而且我看你上面说的,API也是说的Delayed 接口的,我没看到哪里有提到Delayed 的实现只有ScheduledFutureTask一个
首先你理一下你的逻辑,1.
@吴瑞祥:
@超级pengLee: 不太清楚你要表达的意思。你是说泛型限制了不同子类进行对比的可能性吗?
那样的话。运算符重载是类级别的,你为什么要纠结于一段代码的某个应用场景呢,
嗯在同一个泛型队列中,是不会有其他类型的对比,但我要是有个DelayQueue<Delayed> 的队列呢
@超级pengLee: 没有,大晚上的,我说话比你冲多了··,头有点痛现在,你体谅下
得把我选成最佳答案才行就在结贴那里
@超级pengLee: 还是那个逻辑撒,你又以一个具体的应用场景来考虑一段代码..
一段代码写出来是考虑他在几乎所有场景下的运行的,这个标准的对比方法,是在你定义的类不需要特定的排序规则的时候,有的实现类会加入自己的对比规则,这个规则是针对他自己,保留这段标准规则,是为了兼容其它子类对象.因为有一个必须要要用getDelay对比的约定