在Java中,我有两个类:
Class A
{
public String ID;
public Object Name;
}
Class B
{
public String ID;
public Object Name;
}
我想要一个方法,我可以将它传递给A类或B类对象:
public void SomeMethod(??? arg)
{
String id = arg.ID;
Object name= arg.Name;
}
是否可以将A类或B类的对象传递给此方法?如果是这样,该方法的签名是如何写的?
我能想到的唯一解决方案是创建一个接口,A类和B类都实现了包含get和set方法的接口来设置字段ID和Name。然后方法的签名将是一个类型为接口的参数。我希望也许有一种更简单的方法,可能还有泛型?
答案 0 :(得分:4)
您需要使用具有适当方法签名的接口(或抽象类)才是正确的。对于java,这两个类是不同的,没有共同点(在Object旁边)。您需要创建一个类层次结构来反映它们之间的共性。
答案 1 :(得分:2)
public void SomeMethod(A arg)
{
String id = arg.ID;
Object name= arg.Name;
}
public void SomeMethod(B arg)
{
String id = arg.ID;
Object name= arg.Name;
}
您可以创建一个界面并让A
和B
实现它。这真的取决于你的应用程序。对于小程序,我只会坚持使用方法重载,因为它只是在程序中引入了不必要的抽象。
对于可扩展性优先的大型应用程序,您可能需要考虑使用接口。假设您稍后想要编写具有C
的类D
和SomeMethod()
。使用界面可以使您不必遍历整个代码并反复重载适当的方法。
如果您确定A
和B
是故事的结尾,则无需创建界面。
编辑:如果要复制大量代码,请制作帮助方法:
public void SomeMethod(A arg)
{
HelpMePlease( arg.ID, arg.Name );
}
public void SomeMethod(B arg)
{
HelpMePlease( arg.ID, arg.Name );
}
private void HelpMePlease( String id, Object name ) {
// 1000 lines of code here
}
答案 2 :(得分:1)
您不需要通用类型。简单的继承将完成工作
abstract class Base {
public String ID;
public Object Name;
}
class A extends Base {
}
class B extends Base {
}
public void SomeMethod(Base arg)
{
String id = arg.ID;
Object name= arg.Name;
}
答案 3 :(得分:1)
泛型用于在编译期间提高类型安全性。
您所询问的内容似乎类似于C ++ 概念或其他各种语言 duck typing 。
在Java中,如果需要在两种不同的类型上执行某些操作序列,则需要引入一个接口或诉诸于脚本/反射。
答案 4 :(得分:0)
定义两个接口,hasID和hasName,然后:
public class MyClass<A extends hasID & hasName>{
public void SomeMethod(A object) {
String id = object.getID();
Object name= object.getName();
}
}
在其respctive接口上定义了getID和getName。