java - 在通用java中使用cast更好的解决方案

标签 java generics

假设我有以下代码:

Object li = new Object(); 

// this causes a compiler warning   

ArrayList<String> lo = (ArrayList<String>)(li); 

好的,我已经编辑了问题,抱歉,我犯了一个错误,重点是,当我们转换到目标时,它会导致编译时警告,目标是参数化类型,有没有更好的解决方案我可以防止代码引起编译时警告吗?

在处理数组时,我们有Arrays.newInstance来代替cast的使用。

<小时/>

原始问题的代码:

// List<String> is a superclass of ArrayList

List<String>      listOne =  new List<String>();

ArrayList<String> listTwo = (List<String>) listOne; 

最佳答案

您无法实例化列表,因为 List is an interface

ArrayList是一个实现List接口(interface)

你可以这样做:

List<String> listOne  =  new ArrayList<String>();
List<String> listTwo  =  listOne;

当使用listOne的代码不关心它是什么类型的列表时,这是正确的方法。

下面的示例说明了为什么这是一个好方法:

List<String> someList = createList();

这里someList被设置为名为createList的方法的返回值。在这种情况下,我们不知道 someList 是什么类型的列表。它可以是一个ArrayList、一个Vector、一个Stack等等...只要createList返回一个实现List接口(interface)的对象,上面的代码就可以工作。通过这种方法,可以修改createList中的代码,而不会影响调用它的代码。

您还可以这样做:

ArrayList<String> listOne  =  new ArrayList<String>();
ArrayList<String> listTwo  =  listOne;

这不太灵活,但它允许您将列表专门视为 ArrayList。

从技术上讲,您可以这样做,但这不是一个好主意:

List<String>      listOne  =  new ArrayList<String>();
ArrayList<String> listTwo  =  (ArrayList<String>) listOne;

最好program to an interface通过声明一个 List 并实例化一个 ArrayList。

下面的示例展示了接口(interface)编程的一些好处:

public static void testIt() {

    List someList;
    ArrayList anArrayList;

    /*
     *  all of these will work 
     */

    someList = createVectorAsList();
    printList(someList);

    someList = createStackAsList();
    printList(someList);

    someList = createArrayListAsList();
    printList(someList);

    // you CAN assign an ArrayList to a List

    someList = createArrayList();
    printList(someList);

    // you CAN treat an ArrayList as a List

    anArrayList = createArrayList();
    printList(anArrayList);


    /* 
     *  none of these work 
     */

    // you can NOT assign List to an ArrayList

    anArrayList = createStackAsList();
    anArrayList = createVectorAsList();

    // you can NOT pass anything but an ArrayList to printArrayList

    printArrayList(createStackAsList());
    printArrayList(createVectorAsList());
    printArrayList(createArrayListAsList());

}

/** Prints any List */

public void printList(List someList) {
    for (Object o : someList) {
        System.out.println(o.toString());
    }
}

/** Prints ArrayLists only */

public void printArrayList(ArrayList someList) {
    for (Object o : someList) {
        System.out.println(o.toString());
    }
}

public List createVectorAsList() {
    Vector v = new Vector();
    v.add("I am a vector element");
    return v;
}

public List createStackAsList() {
    Stack s = new Stack();
    s.add("I am a stack element");
    return s;
}

public List createArrayListAsList() {
    ArrayList ar = new ArrayList();
    ar.add("I am an array list element");
    return ar;
}

public ArrayList createArrayList() {
    ArrayList ar = new ArrayList();
    ar.add("My array is not returned as a list...");
    return ar;
}

关于java - 在通用java中使用cast更好的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12208244/

相关文章:

Java从unix时间戳获取当前日期

c# - 调用泛型类的方法

c# - Xaml 资源中的通用类型

c# - Autofac。如何在构造函数中注入(inject)一个开放的通用委托(delegate)

ios - Swift 泛型和协议(protocol)

c# - 泛型 - C# - 无隐式引用转换

java - 远程分析 Java 应用程序

java - 如何将对象二进制(反)序列化为/形成字符串?

java - MongoDB 过早到达流末尾

java - 将应用上传到应用引擎时出现“此应用不存在”