也许我错过了重点,但来自 C# 背景,我看不出有任何理由使用 Java 的泛型......
在 C# 中,我有一个方法,它接受一个字符串并将其反序列化为一个对象......
public static Deserialize<T>(string source) {
// Use reflection to examine T and determine
// which properties I should be reading from
// the string. Create an instance of T,
// populate the properties and return it
}
我可以这样称呼:x.Deserialize<AnyClass>("String representation of AnyClass");
类型删除似乎使这在 Java 中变得不可能?我下一个最常见的泛型用法是将内容存储在列表中,但因为我不能
List<int>
并且必须框才能使用List<Integer>
,当我可以使用 int[]
时,似乎毫无意义的架空装箱/拆箱.所以...是泛型唯一真正的用途是做类似的事情
List<MyClass> MyClassList = new List<MyClass>
并进行一些编译时类型检查?如果是这样,考虑到变量名称清楚地表明了类型应该是什么,这似乎是多余的(至少只要我使用合理的命名约定)。我禁不住觉得我错过了什么……
最佳答案
好吧,如果您不使用泛型,则每次都可以强制转换。你必须:
// if raw List
MyClass c = (MyClass) myClassList.get(0);
// if List<MyClass>
MyClass c = myClassList.get(0);
例如。
是的,泛型在运行时被删除,是的,它们只是在编译时强制执行类型安全;但是,当您使用边界时,仍然存在运行时类型删除。例子:
public <E extends RuntimeException> E get(final Class<E> c,
final Throwable t)
{
try {
return (E) getHandle(c).invokeExact(t);
} catch (Error | RuntimeException e) {
throw e;
} catch (Throwable oops) {
final RuntimeException exception = new IllegalStateException(oops);
exception.addSuppressed(t);
throw exception;
}
}
E
这里有一个运行时类型删除;它extends RuntimeException
.因此类型转换是 RuntimeException
,而不是 Object
.见javadoc of
Collections.max()
另一个有趣的运行时类型删除示例(提示:为什么它定义 T extends Object & Comparable<? super T>
而不是 T extends Comparable<? super T>
?)
关于java - 有什么理由在 Java 中使用泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27689669/