首页 新闻 会员 周边

太希望有人能解答这个问题了

0
悬赏园豆:50 [已解决问题] 解决于 2014-05-03 00:10
ScheduledThreadPoolExecutor里ScheduledFutureTask类。这个类实现了Delayed接口,其中的compareTo方法如下:
public int compareTo(Delayed other) 
{            
if (other == this) // compare zero ONLY if same object                
 return 0;             
if (other instanceof ScheduledFutureTask) 
{                 
ScheduledFutureTask x = (ScheduledFutureTask)other;
 long diff = time - x.time;              
   if (diff < 0)                    
 return -1;                 
else if (diff > 0)                    
 return 1;    
else if (sequenceNumber < x.sequenceNumber)                     
return -1;                 
else                     
return 1;             
}             
long d = (getDelay(TimeUnit.NANOSECONDS) -                      
                             other.getDelay(TimeUnit.NANOSECONDS));             
return (d == 0) ? 0 : ((d < 0) ? -1 : 1);         
}
但是最后一句代码有什么用呢?
只有当other不是ScheduledFutureTask的对象,才可能执行 long d = (getDelay(TimeUnit.NANOSECONDS) -                       other.getDelay(TimeUnit.NANOSECONDS));             return (d == 0) ? 0 : ((d < 0) ? -1 : 1);
哪位知道这句代码是为了干什么吗?
RoperLee的主页 RoperLee | 初学一级 | 园豆:76
提问于:2014-05-02 17:13
< >
分享
最佳答案
0

 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

 

收获园豆:50
吴瑞祥 | 高人七级 |园豆:29449 | 2014-05-02 17:58

@超级pengLee: 0.0抱歉.

参数是Delayed 

ScheduledFutureTask类应该继承了Delayed 

就是用来对比Delayed 或继承了Delayed 的对象

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-02 19:21

@超级pengLee: 搞不懂,为什么会不能一样other是什么类型的?

public int compareTo(Delayed other) 

是Delayed ,这个类是什么类型的?是ScheduledFutureTask,你小学数学老师知道你这么吊吗····

ScheduledFutureTask类应该是Delayed 的一个子类,这个是用来兼容父类的其他子类对象的

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-02 22:26

@超级pengLee: 首先,如果(other instanceof Delayed) 这才永远为真

我现在要定义一个类B,实现Delayed接口,这时候我能不能实例化一个B对象,然后放到这个public int compareTo(Delayed other) 方法里当参数?

是父类引用可以指向所有子类对象,这时候子类对象是可以不同的。你如果将一个子类引用强转成父类引用,那是永远有出异常的,但你要用父类引用强转成子类的,就需要这个父类引用本来就指向那个子类的对象,

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-02 22:46

@超级pengLee: 谁跟你说他是用来对比ScheduledFutureTask类的大小,他的参数类型是Delayed。

也就是说他可以传入一个非ScheduledFutureTask的继承或实现了Delayed的类的对象,这时候这个判断是不是会为负?就算你现在觉得你不会往里面放一个非ScheduledFutureTask类的对象,但你能保证这段代码存在的时候都没人会这样去做吗?

总的来说,这个代码既然这些写了。我猜当时程序员的意思就是为了兼容Delayed的其他子类对象的

 

上面这个多没什么用

 

这个程序的目的就是为了为通过compareTo方法来设定 ScheduledFutureTask类的对象的大小,既然这样那么这个other就肯定是

ScheduledFutureTask类的对象呀,不是吗   

 

你自动的把参数的类型Delayed 转换成了ScheduledFutureTask,然后才有了这个问题

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-02 23:04

@超级pengLee: DelayedQueue<ScheduledFutureTask>这非常明显,是一个泛型,

泛型的目的就是为了实现代码重用也就是ScheduledFutureTask的对象是可以也应该被转换的。

你不要以(这个代码是为了实现功能A,他这样写没什么意义啊。)这种逻辑来读代码

而应该(这个代码这样写,哦。。原来可以实现功能A,但这个地方这样写有什么好处呢)这样的逻辑来读代码

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-02 23:08

@超级pengLee: 嗯,你的问题是什么?还是说Delayed接口的实现一定是ScheduledFutureTask类,然后

if (other instanceof ScheduledFutureTask)就永远为真?

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-02 23:30

@超级pengLee: 当然必须要有,API归API,代码归代码。

先不说API有没问题,在这代码这里,这一段是必须的,不然你放别的对象进去怎么办,而且我看你上面说的,API也是说的Delayed 接口的,我没看到哪里有提到Delayed 的实现只有ScheduledFutureTask一个

首先你理一下你的逻辑,1.

long d = (getDelay(TimeUnit.NANOSECONDS) -                      
                             other.getDelay(TimeUnit.NANOSECONDS));             
return (d == 0) ? 0 : ((d < 0) ? -1 : 1);这段代码没用
2.这段代码没用的前提是 Delayed 一定是ScheduledFutureTask
3.这个前提是对的。你明白没有?
吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-02 23:40

@吴瑞祥: 

long d = (getDelay(TimeUnit.NANOSECONDS) -                      
                             other.getDelay(TimeUnit.NANOSECONDS));             
return (d == 0) ? 0 : ((d < 0) ? -1 : 1);
可以没有只是为了避免异常的话,那么上面的api中那段话中又何必说”必须”要用getDelay方法实现compareTo方法的大小判定呢?这不是必须的呀
这段代码不就是在用getDelay方法实现compareTo的判定?哪里有问题?
这不是说用来避免异常,是说兼容其他接口实现方式
你的逻辑好混乱····
吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-02 23:42

@超级pengLee: 不太清楚你要表达的意思。你是说泛型限制了不同子类进行对比的可能性吗?

那样的话。运算符重载是类级别的,你为什么要纠结于一段代码的某个应用场景呢,

嗯在同一个泛型队列中,是不会有其他类型的对比,但我要是有个DelayQueue<Delayed> 的队列呢

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-03 00:00

@超级pengLee: 没有,大晚上的,我说话比你冲多了··,头有点痛现在,你体谅下

得把我选成最佳答案才行就在结贴那里

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-03 00:09

@超级pengLee: 还是那个逻辑撒,你又以一个具体的应用场景来考虑一段代码..

一段代码写出来是考虑他在几乎所有场景下的运行的,这个标准的对比方法,是在你定义的类不需要特定的排序规则的时候,有的实现类会加入自己的对比规则,这个规则是针对他自己,保留这段标准规则,是为了兼容其它子类对象.因为有一个必须要要用getDelay对比的约定

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-04 09:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册