java - <?> 与 <T>

标签 java generics

我偶然发现了一个看起来像这样的函数:

public void function(Class<?> clazz) {...}

将方法更改为的优点/缺点是什么:

public <T> void function(Class<T> clazz) {...}

编辑:什么是编译时间/运行时间差异。

最佳答案

tod​​d.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/

相关文章:

java - 如何在 Java 中创建独立的 RESTful 服务来使用 JSON?

java - 如何在 NetBeans 7.1.1 中为日志消息创建代码模板

c# - C# 类可以将自己的类型作为泛型类型引用吗?

java - 尝试在 Jersey 2.27 中绑定(bind)工厂类时出现编译错误

java - 在 fragment 内创建第二个 Android 导航栏

java - Spark 数据集 - NumberFormatException : Zero length BigInteger

Java泛型类型的推断

c# - 为什么接受引用类型的泛型方法不接受可空类型作为参数?

c# - 为大型 XML 文件生成数字 XML 签名

java - 奇怪的行为,Long 的通用 ArrayList