子类中的Java泛型和有界参数

子类中的Java泛型和有界参数,java,generics,Java,Generics,我试图理解如何在接口中以有界类型参数的形式使用泛型。在这种情况下,为了避免在具体实现中使用绑定参数时强制转换,我遇到了一个问题。我将使用以下示例来说明我的问题: 有一个接口和两个具体实现 public abstract class Publication { } public class Newspaper extends Publication { } public class Newspaper extends Publication { } //DOES NOT COMPILE

我试图理解如何在接口中以有界类型参数的形式使用泛型。在这种情况下,为了避免在具体实现中使用绑定参数时强制转换,我遇到了一个问题。我将使用以下示例来说明我的问题:

有一个接口和两个具体实现

public abstract class Publication {
}


public class Newspaper extends Publication {
}


public class Newspaper extends Publication {
}
//DOES NOT COMPILE
public class MagazinePublisher implements Publisher{

   @Override
   public void publish(Magazine publication) {
       //do something with the magazine, its already the type we need without casting
   }
}

//COMPILES but a cast is required to get the type I want
public class NewsPaperPublisher implements Publisher{

   @Override
   public  void publish(Publication publication) {
       // Now I need to cast 
       Newspaper newspaper = (Newspaper)publication;
       //Do some stuff here 
   }
}
然后我们有一个界面,它代表一家出版社,有两个具体的实现,一个是出版杂志,另一个是报纸

public interface Publisher {
    public <T extends Publication >void publish(T publication);
}

这个例子可能有点做作。。。我理解MagazinePublisher类不编译的原因:我试图用一个比接口中发布方法契约定义的更具体的类来实现该方法。那么,如何使用泛型来避免NewsPaperPublisher类的publish()方法中的强制转换呢?

您希望使接口成为泛型的

public interface Publisher <T extends Publication> {
    void publish(T publication);
}

您希望使接口通用

public interface Publisher <T extends Publication> {
    void publish(T publication);
}

因为您有define
T extensed Publication
,并且在您的NewsPaperPublisher的发布方法中,您传递的是发布本身,而不是传递某个扩展发布的类。因为您有define
T extensed Publication
,而在您的NewsPaperPublisher的发布方法中,您传递的是发布本身,而不是发布本身然后传递一些扩展发布的类。这个答案对我也很有用,我从来没有使用过泛型接口..:谢谢,大卫,我试着做与OP相同的事情,这帮助我解决了问题……这个答案对我也很有用,我从来没有使用过通用接口谢谢你,大卫,我试着做与OP相同的事情,这帮助我解决了我的问题。。。。。