gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:36:49 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com