如何在Java中编写通用方法。
在C#中,我会这样做:
在C#中,我会这样做:
public static T Resolve<T>()
{
return (T) new object();
}
在Java中对应的是什么?
首先,你的C#示例是错误的;除非typeof(T) == typeof(object)
,否则它将抛出InvalidCastException
。你可以通过添加constraint来修复它:
public static T Resolve<T>() where T : new() {
return new T();
}
public static <T> T Resolve() {
return (T) new T();
}
T
的双重提及:一个是 <T>
中参数化方法的 T
,另一个是返回类型的 T
。T
的运行时类型信息是不可用的,因此上述方法会导致编译时错误。现在,您可以通过以下方式绕过此限制:public static <T> T Resolve(Class<T> c) {
return c.newInstance();
}
T.class
。这被称为运行时类型标记。这是处理此情况的惯用方式。<T>
了。 - Matthijs Wessels正如其他评论者指出的那样,您也可以使用Java来完成此操作 - 在运行时可能会创建转换异常的情况下:
@SuppressWarnings("unchecked")
public static <T> T resolve() {
return (T) new Object();
}
除非您使用@SuppressWarnings
注释,否则Java的类型擦除将发挥作用,并且您将收到编译器警告。异常也会在其他地方发生:无论您尝试在哪里使用它:
String s = <String>resolve();
会抛出异常。
另一方面,在C#中,您可能想要使用new T()
。但在Java中无法这样做。建议的解决方法是,如果需要在运行时依赖类型信息,则使用Class<T>
作为类型参数。对于您的示例,这意味着您需要将其重构为以下版本:
public static <T> T resolve(Class<T> type) {
try {
return type.newInstance();
} catch(Exception e) {
// deal with the exceptions that can happen if
// the type doesn't have a public default constructor
// (something you could write as where T : new() in C#)
}
}
public static <T> T resolve(Class<T> type) {
return type.cast(new Object());
}
T
为除 Object
以外的任何类型时发生的异常。试试这个http://java.sun.com/docs/books/tutorial/extra/generics/methods.html
public static <T> T Resolve()
{
return (T) new Object();
}
关于(T)
要小心,但我不确定这是否正确。我知道通用转换会引起很多问题。我已经花了很多时间处理它...
你需要某种工厂:
public interface MyFactory<T> {
T newInstance();
}
然后可以将其传递到需要的位置。在您的代码中:
public static T resolve<T>(MyFactory<T> factory) {
return factory.newInstance();
}
MyFactory
的实现可以根据需要构造特定的 T
。 - Tom Hawtin - tackline
T
不是object
,你的 C# 代码会抛出一个 InvalidCastException 异常。 - dtb