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

在不破坏构建的情况下向Java代码引入泛型,java,generics,Java,Generics,以下代码未编译: public class GenericsTest { public static void main(String[] args) { MyList<?> list = new MyList<Object>(); Class<?> clazz = list.get(0); // Does not compile with reason // "Type mi

以下代码未编译:

public class GenericsTest {    
    public static void main(String[] args) {
        MyList<?> list = new MyList<Object>();
        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<T> extends ArrayList<Class<T>> {
    }
}
并使用MyList编写代码

MyList list = new MyList();
...
MyObject o = list.get(0);
现在在开发过程中,我想向MyObject引入泛型

public class MyObject<T> {}
编译

好的,看来当我介绍这个泛型时,我不得不接受将对MyList的所有调用都更改为泛型表单。我希望旧代码只引入警告而不是错误。

您尝试过:

Class clazz2 = list2.get(0).getClass();
请访问: 您是否尝试过:

Class clazz2 = list2.get(0).getClass();
请访问:

我认为您不太了解泛型是如何工作的

MyList<?> list = new MyList<Object>();
Class<String> clazz= list.get(0);


我想你还不太了解泛型是如何工作的

MyList<?> list = new MyList<Object>();
Class<String> clazz= list.get(0);


我在这台机器上没有编译器,但应该可以用

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

    }


    static class MyList<T> extends ArrayList<Class<? extends T>> {
    }
}
公共类泛型测试{
公共静态void main(字符串[]args){
MyList=新建MyList();
Class clazz=list.get(0);
}

静态类MyList扩展了ArrayList我在这台机器上没有编译器,但这应该可以工作

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

    }


    static class MyList<T> extends ArrayList<Class<? extends T>> {
    }
}
公共类泛型测试{
公共静态void main(字符串[]args){
MyList=新建MyList();
Class clazz=list.get(0);
}

静态类MyList扩展ArrayList在您的示例中,MyList是要更新以支持泛型的旧代码吗?如果是,我的列表应该包含什么类型的对象

正如在此处其他地方提到的,编译错误是有效的。这是由于在访问原始列表时未将get转换为类。因此,代码试图将对象分配给类的引用。这相当于:

Object o = new Object();
Class c = o;

它根本无法编译。此外,为了充分利用泛型,您应该更喜欢类而不是类。

在您的示例中,我列出了要更新以支持泛型的旧代码吗?如果是,我的列表应该包含什么类型的对象

正如在此处其他地方提到的,编译错误是有效的。这是由于在访问原始列表时未将get转换为类。因此,代码试图将对象分配给类的引用。这相当于:

Object o = new Object();
Class c = o;

无法编译。此外,为了充分利用泛型,您应该选择类而不是类。

在您的示例中,第二个示例不起作用,因为您没有使用泛型,因此这意味着get()方法将返回一个对象,您需要将其强制转换为类。如果您没有为MyList指定类型:

MyList list2=新的MyList()


然后,您将失去泛型的优势,在调用get()方法时需要强制转换对象,就像在过去的好日子一样。

在您的示例中,第二个示例不起作用,因为您没有使用泛型,所以这意味着get()方法将返回一个对象,您需要将其强制转换为类。当您不为MyList指定类型时:

MyList list2=新的MyList()


然后,您将失去泛型的优势,需要在调用get()时强制转换对象方法,就像以前一样。

如果您提供编译错误和代码,这会有所帮助。编译错误在示例的注释中。如果您提供编译错误和代码,这会有所帮助。编译错误在示例的注释中。我想您还没有看到类MyList最后的声明:static类MyList扩展了ArrayList。有一个定义,MyList接受类对象。好的,我在结尾抓住了这一点-但他希望MyList可以转换为MyList,事实并非如此。不,我不希望MyList可以转换为MyList。我希望MyList可以转换为MyList。对不起,我的示例有一个错误。对于您更正的ex例如,我的第二个答案仍然适用——get()原始列表上的方法返回一个对象,因此您需要显式地将其强制转换为类。我想您还没有看到最后一个类MyList的声明:静态类MyList扩展了ArrayList。有一个定义,MyList接受类对象。对,我在最后捕捉到了这一点-但他希望MyList可以转换为MyList,这是正确的不是。不,我不希望MyList可以转换为MyList。我希望MyList可以转换为MyList。抱歉,我的示例有错误。对于您更正的示例,我的第二个答案仍然适用-get()原始列表上的方法返回一个对象,因此您需要显式将其强制转换为类。但这是不同的!String.Class!=String.Class.getClass(),但这是不同的!String.Class!=String.Class.getClass()。是的,它会返回。存在运行时错误,因为它在空列表上调用get(),但代码会编译。是的,代码会编译,但两者都不会编译“Class clazz=list.get(0);”或“MyList list=new MyList();Class clazz=list.get(0);”类是的。存在运行时错误,因为它对空列表调用get(),但代码会编译。是的,代码会编译,但“Class clazz=list.get(0);”或“MyList list=new MyList();Class clazz=list.get(0);”类都不会
MyList<?> list = new MyList<Object>();
//generates a warning about an unchecked cast
Class<String> clazz = (Class<String>) list.get(0);
MyList list2 = new MyList();
Class clazz2 = (Class) list2.get(0);
public class GenericsTest {    
    public static void main(String[] args) {
        MyList<Object> list = new MyList<Object>();
        Class<?> clazz= list.get(0);

    }


    static class MyList<T> extends ArrayList<Class<? extends T>> {
    }
}
Object o = new Object();
Class c = o;