庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

方法签名,泛型滥用?

Posted on 2009-05-24 20:05 dennis 阅读(2189) 评论(5)  编辑  收藏 所属分类: java

    最近遇到一个选择题,在xmemcached中,get方法原来的签名是这样的:
public Object  get(final String key) throws TimeoutException,InterruptedException,MemcachedException;
    那么用户使用的时候,需要自己转型,也就是这样

String value=(String)client.get("key");

    后来我将get方法的签名改成了泛型方法,xmemcached帮你做这个转型工作,
public <T> T get(final String key) throws TimeoutException,InterruptedException, MemcachedException;

    方法的实现因为有了个转型,不得不加上抑制警告,
    @SuppressWarnings("unchecked")
    
public final <T> T get(final String key) throws TimeoutException,
            InterruptedException, MemcachedException {
        
return (T) get(key, DEFAULT_OP_TIMEOUT);
    }
    这样用户使用的时候,就不需要显式转型,而是xmemcached帮你做了,
String value=client.get("key");
    后来,我仔细想了这个问题,尽管这里使用了泛型方法,似乎简化了用户的工作,然而却丢掉了编译警告,抑制警告让用户可能忽略这里可能的转型失败,这与泛型的初衷似乎不符。可是,另一个观点冒出来支持我,用户往memcached存进去一头大象,他(她)不会希望取出来的时候变成驴子,我们帮他做这个转型工作可以让用户使用起来更简便。你怎么看呢?
    
     


评论

# re: 方法签名,泛型滥用?  回复  更多评论   

2009-05-24 23:23 by megan
学习了,
我觉得忠于用户感受是最重要的。

# re: 方法签名,泛型滥用?  回复  更多评论   

2009-05-25 19:30 by ecbeta
这个似乎有点问题. 因为你有一个方法是需要转型的,那为什么那个方法不是泛型的呢?

# re: 方法签名,泛型滥用?  回复  更多评论   

2009-06-07 01:35 by cast
try this:

public final <T> T get(final String key, Class<T> clz) throws TimeoutException,
InterruptedException, MemcachedException {
return clz.cast(get(key, DEFAULT_OP_TIMEOUT));
// if it is not T type, it will raise ClassCastException in cast() method.
}

# re: 方法签名,泛型滥用?  回复  更多评论   

2009-06-07 07:14 by dennis
是的,这是个办法,然后这与让用户自己转型没有多大区别,用户还是传入一个额外的参数,反而更麻烦。

# re: 方法签名,泛型滥用?[未登录]  回复  更多评论   

2011-07-15 12:39 by Jeff
个人觉得这里还是不要范型的好。
作为一个基础接口,此处存的对象千奇百怪,调用者更应该负责将对象cast回自己所需要的对象,因为他自己必须明白自己曾经放了什么对象。


只有注册用户登录后才能发表评论。


网站导航: