当前位置:  开发笔记 > 编程语言 > 正文

在不破坏构建的情况下将泛型引入Java代码

如何解决《在不破坏构建的情况下将泛型引入Java代码》经验,为你挑选了1个好方法。

以下代码无法编译:

public class GenericsTest {    
    public static void main(String[] args) {
        MyList list = new MyList();
        Class clazz = list.get(0);

        // Does not compile with reason 
        // "Type mismatch: cannot convert from Object to Class"
        MyList list2 = new MyList();
        Class clazz2 = list2.get(0);
    }
    static class MyList extends ArrayList> {
    }
}


我想这样做是为了在不破坏构建的情况下将泛型引入旧代码.

这是编译器(eclipse和javac)中的错误还是我在这里遗漏了什么?将泛型引入MyList还有什么其他可能性?

编辑

为了澄清:

我有通用类

public class MyList extends ArrayList {}

public class MyObject {}

和使用MyList的代码

MyList list = new MyList();
...
MyObject o = list.get(0);

现在在开发过程中,我看到我想向MyObject引入泛型

public class MyObject {}

现在我想在MyList中拥有这个新的通用东西

public class MyList extends ArrayList> {}

但这确实打破了我的构建.有趣的是

public class MyList extends ArrayList> {
    public MyObject get(int i) {
        return super.get(i);
    }
}

将允许旧代码

MyList list = new MyList();
...
MyObject o = list.get(0);

编译.

好吧,似乎当我介绍这个泛型时,我将不得不将所有对MyList的调用更改为通用形式.我希望旧代码只引入警告而不是错误.



1> matt b..:

我认为你并不了解泛型如何运作.

MyList list = new MyList();
Class clazz= list.get(0);


这段代码片段无法编译,因为您告诉编译器list将保留Class类型 - 然后在下一行中,您希望它返回给您Class.Java中的通用系统不能像你想象的那样转换基于继承的泛型使用的类型.

如果你期望list持有Class,那么你需要声明它 - 或者,如果你希望它能够持有任何类型,那么你不能在没有强制转换的情况下进行第二行.

MyList list = new MyList();
Class clazz = list.get(0);

要么

MyList list = new MyList();
//generates a warning about an unchecked cast
Class clazz = (Class) list.get(0);



第二个代码片段不起作用,因为当您使用原始类型时,仍然需要将Object返回get()的内容强制转换为您正在使用的声明类型(这一直是这种情况).

MyList list2 = new MyList();
Class clazz2 = (Class) list2.get(0);

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有