? wildcard type parameter

type undeterminedの状態で動かすには\<?>を指定
以下の制約がある
・nullしか渡せない
・Objectが返却される

```java
class X <T>{
    T t;
    X(T t) {
        this.t = t;
    }
    T get() {
        return t;
    }
    void set(T t) {
        this.t = t;
    }
}
public class Outer {
    public static void main(String args[]) {
        X<?> x = new X<>("xx");
        String s;
        s = x.get();    //err
        s = (String) x.get();
        x.set(null);
        x.set("100");   //err
    }
}
```
```
-------------------------------------------------------------
COMPILATION ERROR : 
-------------------------------------------------------------
com/mycompany/mavenproject1/Outer.java:[41,18] 不適合な型: ?のキャプチャ#1をjava.lang.Stringに変換できません:
com/mycompany/mavenproject1/Outer.java:[44,15] 不適合な型: java.lang.Stringを?のキャプチャ#2に変換できません:
2 errors 
-------------------------------------------------------------
```
? extends Xは、XもしくはXのsub class
? super Xは、XもしくはXのsuper class
? extends Xは、XもしくはXのsuper classを受け取ることができる
? super Xは、XもしくはXのsub classをセットすることができる。
```java
class A{
    void method(){
        System.out.println("A");
    };
}
class B extends A{
    @Override
    void method(){
        System.out.println("B");
    };
}
class C extends B{
    void method(){};
}

class X <T>{
    T t;
    T get() {
        return t;
    }
    void set(T t) {
        this.t = t;
    }
}
public class Outer {
    public static void main(String args[]) {
        X<? extends B> x = new X<>();   //? = B or C . we can get B or super class
        A a = x.get();
        B b = x.get();
        C c = x.get();   //error  if ? = B , we cannot receive B instance to C field.
        x.set(new A());   //error
        x.set(new B());   //error
        x.set(new C());   //error
        x.set(null);
        X<? super B> x1 = new X<>();    //? = B or A. we can set B or sub class  
        A a1 = x1.get();   //error
        B b1 = x1.get();   //error
        C c1 = x1.get();   //error
        x1.set(new A());  //error     if ? = B, you cannnot set A instance to B field. 
        x1.set(new B());
        x1.set(new C());
        x1.set(null);
    }
}
```
```
-------------------------------------------------------------
COMPILATION ERROR : 
-------------------------------------------------------------
com/mycompany/mavenproject1/Outer.java:[40,20] 不適合な型: ? extends com.mycompany.mavenproject1.Bのキャプチャ#1をcom.mycompany.mavenproject1.Cに変換できません:
com/mycompany/mavenproject1/Outer.java:[41,15] 不適合な型: com.mycompany.mavenproject1.Aを? extends com.mycompany.mavenproject1.Bのキャプチャ#2に変換できません:
com/mycompany/mavenproject1/Outer.java:[42,15] 不適合な型: com.mycompany.mavenproject1.Bを? extends com.mycompany.mavenproject1.Bのキャプチャ#3に変換できません:
com/mycompany/mavenproject1/Outer.java:[43,15] 不適合な型: com.mycompany.mavenproject1.Cを? extends com.mycompany.mavenproject1.Bのキャプチャ#4に変換できません:
com/mycompany/mavenproject1/Outer.java:[46,22] 不適合な型: ? super com.mycompany.mavenproject1.Bのキャプチャ#5をcom.mycompany.mavenproject1.Aに変換できません:
com/mycompany/mavenproject1/Outer.java:[47,22] 不適合な型: ? super com.mycompany.mavenproject1.Bのキャプチャ#6をcom.mycompany.mavenproject1.Bに変換できません:
com/mycompany/mavenproject1/Outer.java:[48,22] 不適合な型: ? super com.mycompany.mavenproject1.Bのキャプチャ#7をcom.mycompany.mavenproject1.Cに変換できません:
com/mycompany/mavenproject1/Outer.java:[49,16] 不適合な型: com.mycompany.mavenproject1.Aを? super com.mycompany.mavenproject1.Bのキャプチャ#8に変換できません:
8 errors 
-------------------------------------------------------------
```