Java通配符引用

时间:2016-11-26 02:47:03

标签: java

想象一下,我有一个名为Value的类通配符类来保存一种可以是String,int或boolean的值。

public class Value<Type>{
   Type _value;

   public Value(Type value) {
       _value = value;
   }

   public Type getValue() {
       return _value;
   }

}

我将从这个类中保存一堆实例,如下所示:

private ArrayList<Value<?>> _myValues = new ArrayList<Value<?>>();

在此之后,我将使用我存储的值制作一些东西。那么如果它是一个int,一个String或一个布尔值,我如何检查ArrayList中的每个Value实例,然后将它分配给一个变量?类似的东西:

//If it is it
int myNumber = someValueInstance.getValue();

这样的事情甚至可能吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

Value<?>基本上等同于Value<Object>,因此getValue的返回类型为Object。您可以使用instanceof检查值是IntegerString还是Boolean

Object val = someValueInstance.getValue();
if (val instaceof Integer) {
    int number = (Integer)val;
    //...
} else if (val instaceof String) {
    String string = (String)val;
    //...
} else if (val instaceof Boolean) {
    boolean bool = (Boolean)val;
    //...
}

答案 1 :(得分:0)

您可能想要做什么而不是使用原始变量来存储ArrayList的内容我将使用Wrapper对象。您可以从ArrayList获取特定值并将其放入包装器对象。

但是在不知道值列表的类型的情况下,我不认为在将它存储在变量中之前可以确定它,因为在存储它之前你必须知道存储的内容。希望这可以帮助! :)

答案 2 :(得分:0)

实际上,实现这一目标的唯一方法是进行一系列instanceof检查,但这在我看来会破坏泛型的目的。

您的列表中包含Value<?>,这意味着默认, 我不知道这些Value对象中包含的是哪种类型,但我想要一个列表 如果您不关心包装中包含的类型,那么通配符表单会更方便,因为对类型的操作比它更复杂需要(if instanceofList<Type<String>> stringWrappers = new ArrayList<>(); List<Type<Integer>> integerWrappers = new ArrayList<>(); List<Type<Boolean>> booleanWrappers = new ArrayList<>(); 语句 - 请记住,此通用 未绑定 )。

如果您知道类型,那么您应该在您拥有的集合中声明;根据您的需要创建尽可能多的集合。这会产生更多的开销,因为现在你必须做一些工作才能将它们插入到正确的列表中,但它更简单,更直接,更常规地处理包装器中包含的值。

testlist = ['TREE', 'HAPPY']
Class MyStrategy(strategy.BacktestingStrategy):
    def __init__(self, feed, instrument):
        super(MyStrategy, self).__init__(feed, 1000)
        self.__position = [] #None
        self.__instrument = instrument
        self.setUseAdjustedValues(True)
        self.__prices = feed[instrument].getPriceDataSeries()
        self.__sma = ma.SMA(feed[instrument].getPriceDataSeries(), smaPeriod)

    def get_score(self,banana)
        fruit_lover= self.__sma
        return fruit_lover + banana

    def onBars(self, bars):
        for x in bars.getInstruments():

            list_large = {}
            for y in testlist: 
                list_large.update({y : self.get_score(5)})