使用泛型方法作为重载的替代方法?

时间:2015-08-21 12:06:43

标签: java oop generics

重载很好。但如果我们考虑到我们已经得到了 两个对象ObjectA和objectB。两者都得到了#34; id"和"名称"变量。我想写一个方法(在第三类),它返回给定对象的名称。编写重载函数使我重复代码。这是一个很好的做法吗? 改为使用泛型函数会不会更好?

所以,我知道我可以写一个重载函数,某事。那样:

public String getInfo(ObjectA o){
    if(o.getId()!=1) return o.name;
    return "";
}
public String getInfo(ObjectB o){
    if(o.getId()!=1) return o.name;
    return "";
}

它工作正常。 但两个功能都是一样的!唯一的区别是事实,他们需要一个不同类型的论点。因为它们看起来一样,是不是违反了DRY规则? 我尝试编写简单的泛型方法,但IDE将该.getId和that.name()标记为错误,并建议将其转换为((ObjectA)).getId()或((ObjectB)).getId() 。避免我在线路上做到了#34; T that = clazz.cast(o);? 我做错了什么?

public <T> String getInfo(Class<T> clazz, Object o) {
              T that = clazz.cast(o);
              if (that.getId()!=1) return that.name;

            return "";
        }

一般来说,我想知道,如果我的想法是可能的。我该如何解决我的错误?而且,这是一个好主意吗?或者简单地编写重载函数是否更好?

2 个答案:

答案 0 :(得分:22)

这两个想法都很糟糕。您的ObjectAObjectB类应实现定义getId()getName()方法的通用接口。

然后你可以用一种方法逃脱:

public String getInfo(Interface o){
    if(o.getId()!=1) return o.getName();
    return "";
}

答案 1 :(得分:18)

您的案例是编程接口的理想选择。创建一个界面并移动常用方法。

svn propset svn:ignore -F .svnignore .*\
相关问题