相关疑难解决方法(0)

是否有可能解决"为varargs参数创建T的通用数组"编译器警告?

这是有问题的代码的简化版本,一个泛型类使用具有泛型类型参数的另一个类,并且需要将一个泛型类型传递给具有varargs参数的方法:

class Assembler<X, Y> {
    void assemble(X container, Y... args) { ... }
}

class Component<T> {
    void useAssembler(T something) {

        Assembler<String, T> assembler = new Assembler<String, T>();

        //generates warning:
        // Type safety : A generic array of T is
        // created for a varargs parameter
        assembler.assemble("hello", something);
    }
Run Code Online (Sandbox Code Playgroud)

}

有没有正确的方法将泛型参数传递给varargs方法而不会遇到此警告?

当然有点像

assembler.assemble("hello", new T[] { something });
Run Code Online (Sandbox Code Playgroud)

由于无法创建通用数组,因此无效.

java generics

150
推荐指数
4
解决办法
5万
查看次数

Java泛型和varargs

我想用泛型和varargs实现一个函数.

public class Question {
    public static <A> void doNastyThingsToClasses(Class<A> parent, Class<? extends A>... classes) {
        /*** something here ***/
    }
    public static class NotQuestion {
    }
    public static class SomeQuestion extends Question {
    }
    public static void main(String[] args) {
        doNastyThingsToClasses(Object.class, Question.class, SomeQuestion.class); // OK
        doNastyThingsToClasses(Question.class, SomeQuestion.class); // OK
        doNastyThingsToClasses(Question.class, Object.class, SomeQuestion.class); // compilation failure
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的目的是断言传递给该函数的所有参数都是Class对象,扩展了作为第一个参数给出的Class.因此,main方法的两个第一行将编译,第三行将生成错误.

我的问题是:为什么我得到"类型安全:为varargs参数创建类的通用数组"消息前两行?

我在这里错过了什么吗?

附加问题:如何重新设计它以防止在每行调用"doNastyThingsToClasses"函数时显示此警告?我可以将其更改为"doNastyThingsToClasses(Class <A> parent,Class <?> ... classes)"并删除警告,但这也会删除编译时类型检查 - 如果我想要的话,那就太好了确保正确使用此功能.更好的解决方案?

java generics types variadic-functions

32
推荐指数
4
解决办法
3万
查看次数

标签 统计

generics ×2

java ×2

types ×1

variadic-functions ×1