Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不显式强制转换的情况下将泛型列表传递给超类型_Java - Fatal编程技术网

Java 在不显式强制转换的情况下将泛型列表传递给超类型

Java 在不显式强制转换的情况下将泛型列表传递给超类型,java,Java,我使用的API具有以下方法: public void doSomething(List<Object> list); 在我们的应用程序端,只有一个特定的类,比如“MyClass”,应该传递给这个api方法 因此,针对这一限制,我创建了一个方法来调用API: public void myMethod(List<MyClass>list){ api.doSomething(list); } 当然,它不会编译,我不能使用通配符,因为我不能接触api代码。现在我正在手动将M

我使用的API具有以下方法:

public void doSomething(List<Object> list);
在我们的应用程序端,只有一个特定的类,比如“MyClass”,应该传递给这个api方法

因此,针对这一限制,我创建了一个方法来调用API:

public void myMethod(List<MyClass>list){
 api.doSomething(list);
}
当然,它不会编译,我不能使用通配符,因为我不能接触api代码。现在我正在手动将MyClass泛型转换为Object

有更好的解决方案吗?

没有,如果要避免强制转换,API定义是错误的。最好的API定义可以是:

// *external* API
static class API {
    public void doSomething(List<? extends Object> list) {
        throw new IllegalStateException("not implemented");
    }
}
作为旁注,有任何对象扩展对象吗?扩展对象是冗余的。此API可以重写为:

public void doSomething(List<?> list)
但总的来说,你会有以下情况:

public void doSomething(List<ApiDataModel> list)
那么,正确的方法还是:

public void doSomething(List<? extends ApiDataModel> list)

做一些简单的事情怎么样

public static void myMethod(List<MyClass> list) {
    doSomething(new ArrayList<>(list));
}

除非要删除或向列表中添加内容,否则可以使用此选项。否则,由于您将实例化一个新列表,对它的任何更改都将丢失,并且不会反映到您的列表中,但MyClass对象的各个元素上的更改将被删除。

您可以通过以下方式从列表创建列表:

public void myMethod(List<MyClass> list){
    List<Object> objectList = new ArrayList<>();
    objectList.addAll(list)
    api.doSomething(objectList);
}

或者简单地使用非通用强制转换,这将生成警告:

public void myMethod(List<MyClass> list){
    api.doSomething((List)list);
}

您可以将其强制转换为List:api.doSomethingList;。不确定它是否有效,您可以使用myMethodList或myMethodList。他们可能会收到一个警告,但不是一个错误,至少是第二个。好吧,你可以替换,因为。是的,但为了理解它,我认为我的显式版本更好。@josejuan更惯用。当然@AndyTurner,但我想强化我将更新为Clarify的扩展思想,或者简单地使用非泛型强制转换,这将生成一个警告:您应该指出警告突出显示的危险:允许doSomething将对象的任何子类的实例添加到参数列表中,这可能会破坏使用列表的其他事物的类型安全性。
public void myMethod(List<MyClass> list){
    api.doSomething((List)list);
}