使用具有多个类的Generic / Parameterized java

时间:2014-06-15 08:33:54

标签: java generics

我正在尝试创建一个通用/参数化代码来从我拥有的多个类中调用。我将对其进行编码,因此我有几个具有相同名称的方法的类,所以我希望创建一种通用的方法来调用它们。

假设我有3个不同的类,这些类都将具有返回ints的getAmount()方法和返回字符串的toString()方法

然后我想要一个可能引用这三个中的任何一个的泛型类。

    public class Stuff<Project> {

    private Project p;

    public Stuff(Project aProject) {
       this.p = aProject;
    }

    public int getValue() {
       return p.getAmount();
    }

    public String toString() {
       return p.toString();
    }

java中是否有任何可以为我提供此功能的内容,或者我在使用C进行思考? 我尝试过以各种方式使用Object.getClass()来尝试构建内容,而本网站和docs.oracle网站上的其他几个与通用编程相关的问题似乎没有我想要的东西。这是不可能的,因为类型擦除工作的方式?

2 个答案:

答案 0 :(得分:5)

不要在这里使用泛型,使用接口。在Java中,您使用接口告诉编译器类实现某些方法,而不告诉它如何实现这些方法。

public interface Project {
    int getAmount();
}
public class Stuff {
    private Project p;
    public Stuff(Project aProject) {
        this.p = aProject;
    }
    public int getValue() {
        return p.getAmount();
    }
}

您可以将任何类的实例传递给Stuff的构造函数,只要它实现Project接口:

public class Construction implements Project {
    public int getAmount() {
        // implementation
    }
}
...
Stuff s = new Stuff(new Construction());

答案 1 :(得分:1)

您可以使用界面,抽象类或反射。我会避免使用反射,除非你真的需要它。这看起来像是一个完美的界面工作。

public interface Ammount {
    public int getAmmount();
}


public class BankAccount implements Ammount {

    @Override
    public int getAmmount() {
        return -10; // broke
    }
}

public class PiggyBank implements Ammount {

    @Override
    public int getAmmount() {
        return 12; // rich
    }
}

然后您可以使用某些代码,例如

BankAccount myBankAccount = new BankAccount();
Ammount ammount = myBankAccount;
ammount.getAmmount();

PiggyBank myPiggyBank = new PiggyBank();
Ammount ammount = myPiggyBank;
ammount.getAmmount();