如何在Java中传递泛型参数

时间:2011-08-05 12:15:50

标签: java generics parameters

在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。然后方法的签名将是一个类型为接口的参数。我希望也许有一种更简单的方法,可能还有泛型?

5 个答案:

答案 0 :(得分:4)

您需要使用具有适当方法签名的接口(或抽象类)才是正确的。对于java,这两个类是不同的,没有共同点(在Object旁边)。您需要创建一个类层次结构来反映它们之间的共性。

答案 1 :(得分:2)

使用method overloading

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;
}

您可以创建一个界面并让AB实现它。这真的取决于你的应用程序。对于小程序,我只会坚持使用方法重载,因为它只是在程序中引入了不必要的抽象。

对于可扩展性优先的大型应用程序,您可能需要考虑使用接口。假设您稍后想要编写具有C的类DSomeMethod()。使用界面可以使您不必遍历整个代码并反复重载适当的方法。

如果您确定AB是故事的结尾,则无需创建界面。

编辑:如果要复制大量代码,请制作帮助方法:

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。