Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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_Generics_Inheritance_Wildcard_Bounded Wildcard - Fatal编程技术网

Java 为什么在方法中可以对参数使用有界通配符,而不对返回类型使用有界通配符?

Java 为什么在方法中可以对参数使用有界通配符,而不对返回类型使用有界通配符?,java,generics,inheritance,wildcard,bounded-wildcard,Java,Generics,Inheritance,Wildcard,Bounded Wildcard,我找不到对问题主题的更好描述,所以我将尝试更好地解释我的问题。我注意到,如果使用有界通配符,我可以将其“bound”用作参数,但不能用作返回值。这听起来可能令人困惑,因此我将立即粘贴代码 public static void main (String[] args) { List<?> wildcardList = new ArrayList<> (); List<String> stringList = new ArrayList<&g

我找不到对问题主题的更好描述,所以我将尝试更好地解释我的问题。我注意到,如果使用有界通配符,我可以将其“bound”用作参数,但不能用作返回值。这听起来可能令人困惑,因此我将立即粘贴代码

public static void main (String[] args) {
    List<?> wildcardList = new ArrayList<> ();
    List<String> stringList = new ArrayList<> ();
    takeList (wildcardList); //compiles
    takeList (stringList); //compiles
    /////////////////////////////////////
    List<?> wildcard = returnList (); //compiles
    List<String> strings = returnList (); //doesn't compile

}

static void takeList(List<? extends Object> list){
    //some code
}

static List<? extends Object> returnList(){
    return new ArrayList<> ();
}
publicstaticvoidmain(字符串[]args){
列表通配符列表=新的ArrayList();
List stringList=newarraylist();
takeList(通配符列表);//编译
takeList(stringList);//编译
/////////////////////////////////////
列表通配符=returnList();//编译
List strings=returnList();//不编译
}

静态void takeList(List让我们关注两行:

// f() returns a List<? extends Object>
List<?>      a = f(); // ok: can never do unexpected things
List<String> b = f(); // error: not 100% safe

(*)-我在广义上使用“编译器”,指的是语言和编译器。

让我们关注两行:

// f() returns a List<? extends Object>
List<?>      a = f(); // ok: can never do unexpected things
List<String> b = f(); // error: not 100% safe


(*)-我广义上使用“编译器”,指的是语言和编译器。

你完全可以,它只是没有返回你期望的类型。我明白了,我的目标问题是为什么我使用“绑定”时,那一行代码没有编译。也就是说字符串在里面,因为返回类型是
?extensed Object
,而不是
String
。许多东西扩展
Object
,比如
Number
JButton
的列表?extensed Object
也可能是这些对象的列表。但是字符串扩展了Object,我没有做任何添加()可能有风险的操作。很抱歉,我仍然不理解。如果列表类型是
list
,那么这是一个字符串列表吗?泛型是不变的,继承是协变的。两者是不同的。除了语言不允许你做你正在尝试的事情之外,没什么好说的。你完全可以,这不是r我知道了,我的目标问题是为什么在我使用“绑定”时,那一行代码没有编译。也就是说字符串在里面,因为返回类型是
?extensed Object
,而不是
String
。许多东西扩展
Object
,比如
Number
JButton
的列表?extensed Object
也可能是这些对象的列表。但是字符串扩展了Object,我没有做任何添加()可能有风险的操作。很抱歉,我还是不明白。如果列表类型是
list
,那么这是一个字符串列表吗?泛型是不变的,继承是协变的。两者是不同的。除了语言不允许你做你正在尝试的事情之外,没什么好说的。让我为难的是如果我如果我在
参数
中同时使用通配符和类型变量,那么在这两种情况下都可以使用。当然add()方法不起作用。你能给出一个使用f()返回
并且与
字符串
中的
列表b=f()不同的代码示例吗
编译?当然。我在这里了解了所有内容:您的pastebin示例触及了一个不同的问题-我建议您提出一个新问题,比较
返回列表。让我头疼的是,如果我使用
而不是
,而如果我在
参数中同时使用通配符和类型变量,那么它在这两种情况下都会起作用se add()方法不起作用。你能展示一个使用f()返回
的代码示例吗?它与
字符串
不同,其中
列表b=f();
编译?当然。我在这里就知道了:你的pastebin示例触及了一个不同的问题-我建议你在比较
返回列表时问一个新问题