Java 如何';铸造';指向泛型对象并使用泛型参数执行方法
我有一个类,在请求时初始化一些GUI组件:Java 如何';铸造';指向泛型对象并使用泛型参数执行方法,java,android,generics,Java,Android,Generics,我有一个类,在请求时初始化一些GUI组件: public class ComponentInitializer<T extends View> public abstract void initialize(T object); 是否有可能将代码段简化为一元语句,如下所示: for (ComponentInitializer<? extends View> initializer : this.componentInitializers) { initiali
public class ComponentInitializer<T extends View>
public abstract void initialize(T object);
是否有可能将代码段简化为一元语句,如下所示:
for (ComponentInitializer<? extends View> initializer : this.componentInitializers) {
initializer.initialize(object); // Maybe with some casts
}
private void initComponents(View view) {
for (ComponentInitializer<? extends View> initializer : this.componentInitializers) {
helper(initializer, view);
}
}
private static <T extends View> void helper(ComponentInitializer<T> initializer, View view) {
T object = (T)view.findViewById(initializer.getResourceId());
initializer.initialize(object);
}
for(componentializer知道T
扩展了View
,您可以安全地将对象强制转换为T
。然后将调用相应的方法。这应该可以工作:
private <T extends View> void initComponents(T view) {
for (ComponentInitializer<? extends View> initializer : this.componentInitializers) {
T object = (T) view.findViewById(initializer.getResourceId());
if (object != null) {
((ComponentInitializer<T>) initializer).initialize((T) object);
}
}
}
private void initComponents(T视图){
对于(ComponentInitializer这样的东西怎么样:
for (ComponentInitializer<? extends View> initializer : this.componentInitializers) {
initializer.initialize(object); // Maybe with some casts
}
private void initComponents(View view) {
for (ComponentInitializer<? extends View> initializer : this.componentInitializers) {
helper(initializer, view);
}
}
private static <T extends View> void helper(ComponentInitializer<T> initializer, View view) {
T object = (T)view.findViewById(initializer.getResourceId());
initializer.initialize(object);
}
private void initComponents(视图){
对于(ComponentInitializer这对我来说没有什么意义。t
是一种特定类型,它是或扩展了视图
。你能安全地假设t.findViewById
返回一个t
?你在这里进行了大量未经检查的强制转换,那么你如何证明它们的合理性呢?@PaulBellora:我不能安全地假设t.findV>iewById()
返回T
,但即使在教程中,我也经常看到类似于T list=(T)T.findViewById(R.id.something)
,其中的强制转换也无法保证。您是否考虑过使用反射并查询对象以获取要调用的方法?请参阅:反射可能是一种方法。