自定义函数接受钻石操作员的值

时间:2014-06-15 02:03:04

标签: java

我在C#中看过这个:

this.addComponent<MyClass>();

我如何制作使用类似内容的方法?我试过这样做:

public Component addComponent<T>(){
    return new Component();
}

但它没有用。甚至可以做出类似的东西吗?

1 个答案:

答案 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,虽然这没有在上面的代码中反映出来)