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