如何定义一个具有多种类型的字段?

时间:2014-02-23 18:09:09

标签: java

我有一个类,我希望采用两种不同类型的输入(通过一个构造函数参数)和多态处理。除了处理这两种不同的输入类型之外,类中的所有内容都是相同的,并且我不希望因为需要一个字段具有变量类型而复制所有代码。我想我的问题是如何定义一个变量类型的字段?或者这只是不好的做法?请参阅下面的简单示例,其中我使用* Map Set *作为占位符,表示我希望用于字段或方法返回类型的变量类型。

public abstract class ReturnTwoTypes {  

    public abstract Map<String,Double> *or* Set<String> runProgram();

}




private class ReturnSetType extends ReturnTwoTypes{

    @Override
    public Set<String> runProgram(){

        return new TreeSet<String>();
    }

}




private class ReturnMapType extends ReturnTwoTypes{

    @Override
    public Map<String, Double> runProgram(){

        return new TreeMap<String, Double>();
    }

}




private class UsesReturnTwoTypes{

    //This class has a bunch of code I wish to reuse by not defining separate classes for both the Map and Set version of the MapOrSet field

    private ReturnTwoTypes twotypes;
    private Map<String,Double> *or* Set<String> mapOrSet;

    public UsesReturnTwoType( ReturnTwoTypes twotypes ){

        this.twotypes = twotypes;
    }

    public void runProgram(){

        mapOrSet = twotypes.runProgram();
    }

}

3 个答案:

答案 0 :(得分:4)

让你的班级通用:

public abstract class ReturnTwoTypes<T> {  
    public abstract T runProgram();
}

private class ReturnSetType extends ReturnTwoTypes<Set<String>> {

    @Override
    public Set<String> runProgram(){
        return new TreeSet<String>();
    }
}

答案 1 :(得分:0)

属性不能有多种类型,使用注释中建议的通用Object,答案真的很脏。您可以使用generic方法,也可以让方法返回自定义对象。

答案 2 :(得分:-1)

您可以将它们声明为Object并存储您想要的任何引用。然后,您可以使用instanceofgetClass().getName()来检查其中的内容并采取相应的措施。