Java 为什么在方法中可以对参数使用有界通配符,而不对返回类型使用有界通配符?
我找不到对问题主题的更好描述,所以我将尝试更好地解释我的问题。我注意到,如果使用有界通配符,我可以将其“bound”用作参数,但不能用作返回值。这听起来可能令人困惑,因此我将立即粘贴代码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
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示例触及了一个不同的问题-我建议你在比较返回列表时问一个新问题