java - vararg 参数可以是 <? super 对象>?

标签 java generics variadic-functions

我正在编写一个方法来检查我的方法的参数是否为 null,我刚刚开始接受 varargs 的想法,所以我写了一个很酷的包罗万象的方法:

private <T> void checksIfNull(T... t) throws NullPointerException {
    for (T myT : t) {
        if ( myT == null) {
            throw new NullPointerException("Attempted to pass a null object");
        }
    }
}

但是我越来越贪心了。如果我需要检查 String , List , 和 int , all in one meeting, 就是说我要在调用方法里这样写:

checksIfNull(myString);
checksIfNull(myList);
checksIfNull(myInt);

我想知道是否有一种方法可以让我在与通用参数结合使用时每次都只需要调用一次空值检查方法。我觉得可能有 - 但我的语法可能有误。我已经尝试了以下的一些组合,但它从来没有完全奏效:

private <T> void checksIfNull(T<? super Object>... t) throws NullPointerException {
    for (T myT : t) {
        if ( myT == null) {
            throw new NullPointerException("Attempted to pass a null object");
        }
    }
}

我的右手参数T<? super Object>... t告诉我“Type T 没有类型参数。

最佳答案

泛型在这里没有增加任何值(value)。 T... t 意味着参数类型之间存在一些共性,这是您要避免的。您可以简单地使用 Object...

private void checksIfNull(Object... values) throws NullPointerException {
    for (Object value: values) {
        if (value == null) {
            throw new NullPointerException("Attempted to pass a null object");
        }
    }
}

关于java - vararg 参数可以是 <? super 对象>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41517841/

相关文章:

java - Java 中奇怪的 ClassCastException

c# - IList<T> 作为泛型返回

c - 用于支持和不支持 VARIADIC 的编译器的 printf 宏

java - Java 7 中简化的 Varargs 方法调用

java - 如何以编程方式在文件 *content* 上运行 Checkstyle、Findbugs 或 PMD

java - 基于servlet 3.0的Web框架

java - 需要数组,但 [ClassName] 找到了 java

sqlite - Dart-使用泛型将List <SuperType>转换为List <SubType>

c - 宏中的 __VA_ARGS__ 是什么意思?

持久化实体时出现 javax.ejb.EJBException