我偶然发现了一个看起来像这样的函数:
public void function(Class<?> clazz) {...}
将方法更改为的优点/缺点是什么:
public <T> void function(Class<T> clazz) {...}
编辑:什么是编译时间/运行时间差异。
最佳答案
todd.run 完全正确,但这只是答案的一半。还有用于选择 <T>
的用例在 <?>
(反之亦然)当您不将类型参数添加到包含该方法的类时适用。例如,考虑
public <E extends JLabel> boolean add(List<E> j) {
boolean t = true;
for (JLabel b : j) {
if (b instanceof JLabel) {
t = t && labels.add(b);
}
}
return t;
}
和
public boolean add(List<? extends JLabel> j) {
boolean t = true;
for (JLabel b : j) {
if (b instanceof JLabel) {
t = t && labels.add(b);
}
}
return t;
}
除非您向封闭类添加适当的类型参数,否则第一个方法实际上不会编译,而无论封闭类是否具有类型参数,第二个方法都会编译。如果你不使用 <?>
, 然后你在本地负责告诉编译器如何获取将由在其位置使用的字母填充的类型。您经常遇到这个问题——需要使用吗?而不是 T - 在尝试编写使用或需要“扩展”和“ super ”的通用方法时。 Gilad Bracha's Generics Tutorial (PDF) 的第 18 页对此问题进行了更好但更详尽的处理。 .另见 this stack overflow question他们的回答阐明了这些问题。
查看此堆栈溢出链接以获取有关您的第二个问题的信息:Java generics - type erasure - when and what happens .虽然我不知道关于 <?>
之间编译时间差异的问题的答案和 <T>
,我很确定答案可以在 this FAQ 找到埃里克森在那篇文章中提到的。
关于java - <?> 与 <T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/694897/