有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将子类型强制转换为定义为泛型的类型

我有一个接口Int1。我有一个类Cls1实现Int1。和泛型类Cls2<Cls1>

现在我在写一个方法:

private void <T extends Int1> test(Cls2<Cls1> arg1) {
    ...
    //I try to cast a Cls2<Cls1> into a Cls2<Int1>: it works
    Cls2<Int1> test1 = (Cls2<Int1>) arg1;
    //I try to cast a Cls2<Cls1> into a Cls2<T>: doesn't work
    Cls2<T> test2 = (Cls2<T>) arg1; //compilation error
}

考虑到T扩展了Int1,这段代码有什么问题


共 (1) 个答案

  1. # 1 楼答案

    下面的代码编译intellij中的w/o错误

    interface Int1{}
    class Cls2<T>{}
    class Cls1 implements Int1 {}
    
    
    private <T extends Int1> void test(Cls2<Cls1> arg1) {
        Cls2<Int1> test1 = (Cls2<Int1>)(Cls2<?>)arg1;
        Cls2<T> test2 = (Cls2<T>) arg1;
    }
    

    在java中,由子类和超类参数化的类是不相关的。您需要先强制转换为<?>

    总的来说,如果我上面的内容正确地反映了您的代码,那么泛型的使用是非常奇怪的。请确保您的设计是正确的