想象一下,我有一个名为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();
这样的事情甚至可能吗?
谢谢。
答案 0 :(得分:1)
Value<?>
基本上等同于Value<Object>
,因此getValue
的返回类型为Object
。您可以使用instanceof
检查值是Integer
,String
还是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
instanceof
个List<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)})