? extends Xは、?そのものか、サブクラスを意味する
T extends Aは、AかAのサブクラス(以下の例ではB)
class A{
void method(){
System.out.println("A");
};
}
class B extends A{
@Override
void method(){
System.out.println("B");
};
}
class C {
void method(){};
}
class X <T extends A>{
void method(T t) {
t.method();
}
}
public class Outer {
public static void main(String args[]) {
X<A> x1 = new X();
x1.method(new A());
x1.method(new B());
X<B> x2 = new X();
x2.method(new B());
// X<C> x3 = new X();
}
}
A
B
B
AのサブクラスではないCをtype parameterに指定するとcompile error
X<C> x3 = new X();
-------------------------------------------------------------
COMPILATION ERROR :
-------------------------------------------------------------
com/mycompany/mavenproject1/Outer.java:[37,11] 型引数com.mycompany.mavenproject1.Cは型変数Tの境界内にありません
1 error
List,ArrayListを使ったサンプル
declare side, set sideのgenericsは一致しなければならない
class Sample extends Number{
@Override
public int intValue() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
}
@Override
public long longValue() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
}
@Override
public float floatValue() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
}
@Override
public double doubleValue() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
}
}
public class SampleProject {
public static void main(String[] args) {
List<Number> l = new ArrayList<Number>();
List<? extends Number> l2 = new ArrayList<Number>();
List<? super Number> l3 = new ArrayList<Number>();
List<Sample> l4 = new ArrayList<Number>();
List<Object> l5 = new ArrayList<Number>();
}
}
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:36: エラー: 不適合な型: ArrayList<Number>をList<Sample>に変換できません:
List<Sample> l4 = new ArrayList<Number>();
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:37: エラー: 不適合な型: ArrayList<Number>をList<Object>に変換できません:
List<Object> l5 = new ArrayList<Number>();