如何用Java编写泛型方法

Dan*_*Dan 3 c# java generics

如何用Java编写泛型方法.

在C#中,我会这样做

    public static T Resolve<T>()
    {
        return (T) new object();
    }
Run Code Online (Sandbox Code Playgroud)

什么是Java中的等价物?

jas*_*son 11

首先,你的C#示例是错误的; 它将抛出一个InvalidCastException除非typeof(T) == typeof(object).您可以通过添加约束来修复它:

public static T Resolve<T>() where T : new() {
    return new T();
}
Run Code Online (Sandbox Code Playgroud)

现在,这将是Java中的等效语法(或者,至少,尽可能接近):

public static <T> T Resolve() {
    return (T) new T();
}
Run Code Online (Sandbox Code Playgroud)

注意的双提T在声明:一个是T<T>其中参数化的方法中,第二个是返回类型T.

不幸的是,上述内容在Java中不起作用.由于Java泛型的实现方式,运行时类型信息T不可用,因此上面给出了编译时错误.现在,你可以像这样解决这个约束:

public static <T> T Resolve(Class<T> c) {
    return c.newInstance();
}
Run Code Online (Sandbox Code Playgroud)

注意需要传入T.class.这称为运行时类型令牌.这是处理这种情况的惯用方法.