Fimaly的get方法返回的是一个Object,为什么它不返回下限类型Son呢?
它所引用的对象类型只能是下限类型和下限类型的子类,那么返回的时候
将引用的类型转成下限类型返回是合理的呀,为什么要返回Object?public class GenericLowerBound {
public static void main(String[] args) {
Family<? super Son> g = new Family<Father>();
/*将产生编译时错误,只能添加下限类型及以下的类型对象*/
//g.add(new Father());
g.add(new Son());
Son s = (Son)g.get();
System.out.println(s);
g.add(new GrandSon());
GrandSon gs = (GrandSon)g.get();
System.out.println(gs);
}
}
class Family<T> {
private T t;
public void add(T t) { this.t = t; }
public T get() { return t; }
}
class Father {
public String toString() { return "Father"; }
}
class Son extends Father {
public String toString() { return "Son"; }
}
class GrandSon extends Son {
public String toString() { return "GrandSon"; }
}
它所引用的对象类型只能是下限类型和下限类型的子类,那么返回的时候
将引用的类型转成下限类型返回是合理的呀,为什么要返回Object?public class GenericLowerBound {
public static void main(String[] args) {
Family<? super Son> g = new Family<Father>();
/*将产生编译时错误,只能添加下限类型及以下的类型对象*/
//g.add(new Father());
g.add(new Son());
Son s = (Son)g.get();
System.out.println(s);
g.add(new GrandSon());
GrandSon gs = (GrandSon)g.get();
System.out.println(gs);
}
}
class Family<T> {
private T t;
public void add(T t) { this.t = t; }
public T get() { return t; }
}
class Father {
public String toString() { return "Father"; }
}
class Son extends Father {
public String toString() { return "Son"; }
}
class GrandSon extends Son {
public String toString() { return "GrandSon"; }
}
那么Family<? super Son> g = new Family<Father>();
Family<? super Son> g2 = new Family<GrandFather>();都正确
则调用g.add(new GrandFather()),父类不能自动转为子类,错误
这里的意思是,以T类为下限的某种类,简单地说就是T类的超类。但为什么add(T)可以呢T类为下限的某种类,应当是T类的子类,而不是T类的超类啊,呵呵·
这又是为什么呢?public class GenericBoundUpper { public static void main(String[] args) {
UpperFamily<? extends UpperFather> uf1 = new UpperFamily<UpperSon>();
/*将产生编译时错误*/
//uf1.add(new Object());
//uf1.add(new Father());
//uf1.add(new Son());
//uf1.add(new GrandSon());
uf1.add(null);
UpperFamily<? extends UpperFather> uf2 = new UpperFamily<UpperSon>(new UpperGrandSon());
/*返回的是上限类型*/
UpperFather fa = uf2.get();
System.out.println(fa);
}
}class UpperFamily<T> {
private T t;
public UpperFamily() { }
public UpperFamily(T t) { this.t = t; }
public void add(T t) {
this.t = t;
}
public T get() { return t; }
}
class UpperFather {
public String toString() { return "Father"; }
}
class UpperSon extends UpperFather {
public String toString() { return "Son"; }
}
class UpperGrandSon extends UpperSon {
public String toString() { return "GrandSon"; }
}
实际是生成了一个ArrayList<Son的某个父类>的对象,并将其转为ArrayList<? super Son>,也就是说在实际操作中起作用的是ArrayList<Son的某个父类>,自然不能返回Son对象。
import java.util.ArrayList;
public class Test
{
public static void main(String[] args) throws Exception
{
ArrayList<? super Son> data = new ArrayList<Father>();
data.add(new Son());
data.add(new GrandSon());
//Son s = data.get(0);
Object obj = data.get(0);
}
}class GrandFather{}
class Father extends GrandFather{}
class Son extends Father{}
class GrandSon extends Son{}
import java.util.ArrayList;
public class Test
{
public static void main(String[] args) throws Exception
{
ArrayList<Father> father = new ArrayList<Father>();
father.add(new Father());
ArrayList<? super Son> data = father;
//Son s = data.get(0);
Object obj = data.get(0);
}
}class GrandFather{}
class Father extends GrandFather{}
class Son extends Father{}
class GrandSon extends Son{}