Java Generics: Wildcard capture misunderstanding

前端 未结 6 623
醉话见心
醉话见心 2020-12-01 12:27

Reading the Java online tutorial I haven\'t understand anything about wildcard capture. For example:

    import java.util.List;
    public class WildcardErro         


        
6条回答
  •  没有蜡笔的小新
    2020-12-01 13:12

    I also find this question hard to understand; splitting the single command into two commands helped me.

    Below code is what actually happens in the background when the original method is inspected&compiled, the compiler makes its own local variable: the result of the i.get(0) call is placed in the register on the local variable stack.

    And that is - for the understanding of this issue - the same as making a local variable which for convenience I have given the name element.

    import java.util.List;
    public class WildcardError {
     void foo(List i) {
      Object element = i.get(0);  // command 1
      i.set(0, element);          // command 2
     }
    }
    

    When command 1 is inspected, it can only set the type of element to Object (--> upperbound concept, see Matt's answer), as it can not use ? as a variable type; the ? is only used for indicating that the generic type is unknown.

    Variable types can only be real types or generic types, but since you don't use a generic type in this method like for example, it is forced to use a real type. This forcing is done because of the following lines in the java specification (jls8, 18.2.1):

    A constraint formula of the form ‹Expression → T› is reduced as follows:

    [...]

    – If the expression is a class instance creation expression or a method invocation expression, the constraint reduces to the bound set B3 which would be used to determine the expression's invocation type when targeting T, as defined in §18.5.2. (For a class instance creation expression, the corresponding "method" used for inference is defined in §15.9.3).

提交回复
热议问题