是否可以编写允许类型的子类型和类型本身的Java泛型表达式?

时间:2011-08-11 08:15:02

标签: java generics

鉴于以下情况,只能编写一个适用于SpecificModel的模型处理程序,不可能有一个只处理模型的模型处理程序。但是当我们删除T extends Model表达式时,创建非法的东西会很容易。

public interface Model {} 

public class SpecificModel implements Model {}

public interface ModelHandler<T extends Model> 
{
   void handleModel(T model);
}

是否可以编写像T extends Model || Model这样的构造?因此,如果处理程序不知道T的子类型,那么extend Model必须是Model或必须是Model本身?

谢谢!

3 个答案:

答案 0 :(得分:7)

引自Jos Java的有效Java,关于<? extends E>符号:

  

关键字extends的使用有点误导:   回忆[来自第26项],定义了子类型,以便每种类型都是自身的子类型,   即使它没有扩展自己。

因此,撰写<T extends Model>等同于您的期望:<T extends Model || Model>

答案 1 :(得分:2)

T extends Model匹配Model。因此,您可以在此处创建ModelHandler<Model>

诚然,这个术语有点误导。

(或者你的目标是撰写ModelHandler<any subtype of Model but not Model itself>?)

答案 2 :(得分:0)

如果T extends Model,则T Model。我真的不确定你想在这里写什么...另外 - 在泛型中,extends也代表implements有意义。