我在C#中看过这个:
this.addComponent<MyClass>();
我如何制作使用类似内容的方法?我试过这样做:
public Component addComponent<T>(){
return new Component();
}
但它没有用。甚至可以做出类似的东西吗?
答案 0 :(得分:2)
听起来你问的是generic methods,虽然我并不完全清楚你要做什么。
public <T extends Component> T addComponent(Class<T> clazz) {
return clazz.newInstance();
}
返回类型(<T extends Component>
)之前的T
是使其成为通用方法的原因。它使您能够将任何扩展Component
的类的实例作为参数传递,并返回相同类型的对象。
注意事项:首先,Component
界限是可选的:
public <T> T addComponent(Class<T> clazz){
return clazz.newInstance();
}
允许您传入任何Class对象并获取相同类型的对象。
其次,请注意,如果您希望将实例作为参数而不是Class
对象(这是一个更典型的用例)传递,则会自动推断其类型:
public <T> T doStuff(T input){
input.doStuff(); // does stuff to T instance
return input; //return value is of type T
}
最后请注意,由于type erasure您无法实例化或以其他方式直接引用您方法中T
的类型。例如:
public <T extends Component> T doStuff(T input){
T t = new T(); // NO!
T.someStaticMethod(); // NO!
return (T) new Component(); //hacky, but OK
}
(另外,我假设你知道Class.newInstance()
抛出InstantiationException
,虽然这没有在上面的代码中反映出来)