java - 有什么理由在 Java 中使用泛型?

标签 java generics

也许我错过了重点,但来自 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/

相关文章:

java - 具有 Java 客户端和 Python 服务器的数据报套接字

java - 泛型扩展

c++ - 从lua文件获取简单值到c++的通用解决方案

swift - 在 Swift 中扩展泛型类型的具体实例

java - 有没有实现 Iterable 而不实现 Collection 的 Java 标准类?

java - 在 Android/Java 中跟踪回调结果代码的最佳实践?

java - 如何在老版本的rest-assured中允许自签名SSL证书

java - 陷入无限循环。不明白为什么?

java - Java 5 中注释类型的编译时检查有何变化?

java - 工厂设计模式和Diamond OOP问题