超载很好.但是如果我们认为我们有两个对象ObjectA和objectB.两者都有"id"和"name"变量.我想写一个方法(在第三类),它返回给定对象的名称.编写重载函数使我重复代码.这是一个很好的做法吗?改为使用泛型函数会不会更好?
所以,我知道我可以编写一个重载函数,某事.像那样:
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 "";
}
Run Code Online (Sandbox Code Playgroud)
它工作正常.但两个功能都是一样的!唯一的区别是事实,他们需要一个不同类型的论点.因为它们看起来一样,是不是违反了DRY规则?我尝试编写简单的泛型方法,但IDE将该.getId和that.name()标记为错误,并建议将其转换为((ObjectA)).getId()或((ObjectB)).getId() .我没有在"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 "";
}
Run Code Online (Sandbox Code Playgroud)
一般来说,我想知道,如果我的想法是可能的.我该如何解决我的错误?而且,这是一个好主意吗?或者简单地编写重载函数是否更好?
Kay*_*man 22
这两个想法都很糟糕.您ObjectA和ObjectB类应该实现定义定义getId()和getName()方法的通用接口.
然后你可以用一种方法逃脱:
public String getInfo(Interface o){
if(o.getId()!=1) return o.getName();
return "";
}
Run Code Online (Sandbox Code Playgroud)
Sur*_*tta 18
您的案例是编程接口的理想选择.创建一个界面并移动常用方法.
public String getInfo(InterfaceAB in){
if(in.getId()!=1) return in.getName();
return "";
}
Run Code Online (Sandbox Code Playgroud)