0
0

More than 1 year has passed since last update.

? wildcard type parameter

Last updated at Posted at 2023-02-09

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

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をセットすることができる。

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 
-------------------------------------------------------------
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0