实例化泛型类并实现泛型接口 [英] Instantiating generic class and implementing generic interface

查看:531
本文介绍了实例化泛型类并实现泛型接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public DrawItem {
protected String getSeperator(){
return ;
}
.......
//一些其他方法
}

我有另外一个类,它扩展了 DrawItem

  public DrawNumber extends DrawItem {
@Override
protected String getSeperator(){
return - ;




$ b现在,在泛型类 CombinationGenerator< E> ,我试图实例化 DrawItem / DrawNumber 。由于在Java中实例化泛型类型是不可能的(例如 new E(...)),所以我根据this 答案

 公共接口DrawItemFactory< E  - 代替; {
E创建(...);
}

然后在 CombinationGenerator< E> class,

  public class CombinationGenerator< E> {
DrawItemFactory< E>厂;

public CombinationGenerator< E>(DrawItemFactory< E>工厂){
this.factory = factory;
}

public List< E> generate(){
......
list.add(factory.create(...));
......
}
}

现在 DrawNumber 类实现 DrawItemFactory< DrawItem> 接口。

  public DrawItem implements DrawItemFactory< DrawItem> {
protected String getSeperator(){
return;

$ b @Override
public DrawItem create(...){
return new DrawItem(...);
}
.......
//一些其他方法
}

我可以创建 CombinationGenerator< DrawItem> class。

  DrawItem drawItem = new DrawItem(...); 
CombinationGenerator< DrawItem> generator = new CombinationGenerator< DrawItem>(drawItem);
列表< DrawItem>组合= generator.generate();

到目前为止,一切都很好。但是,当我尝试创建一个像这样的 DrawNumber 类时,

  public DrawNumber实现DrawItemFactory< DrawNumber> {
....
}

它给了我以下错误:

 使用不同的参数不能多次实现接口DrawItemFactory:DrawItemFactory< DrawItem>和DrawItemFactory< DrawNumber> 

我试过这个解决方案,但我得到了同样的错误。有没有其他方法可以做到这一点?根据@JB Nizet的评论,我已经通过创建两个解决了这个问题单独的工厂类如下所示:

  public interface ItemFactory< E> {
E create(int [] values);

public static class DrawItemFactory implements ItemFactory< DrawItem> {

@Override
public DrawItem create(int [] values){
return new DrawItem(values);
}
}

public static class DrawNumberFactory implements ItemFactory< DrawNumber> {

@Override
public DrawNumber create(int [] values){
return new DrawNumber(values);





$ CombinationGenerator

  public class CombinationGenerator< E> {
ItemFactory< E>厂;

public CombinationGenerator< E>(ItemFactory< E>工厂){
this.factory = factory;
}

public List< E> generate(){
......
list.add(factory.create(...));
......
}
}

实例化 CombinationGenerator 像这样:
$ b

  DrawNumber drawNumber = new DrawNumber(); 
CombinationGenerator< DrawNumber> generator = new CombinationGenerator< DrawNumber>(new ItemFactory.DrawNumberFactory());

列表< DrawNumber>组合= generator.generate();


I have this class:

public DrawItem {
    protected String getSeperator() {
        return "";
    }
    .......
    // some other methods
}

I've another class which extends DrawItem.

public DrawNumber extends DrawItem {
    @Override
    protected String getSeperator() {
        return "-";
    }
}

Now, in a generic class CombinationGenerator<E>, I'm trying to instantiate objects of DrawItem/DrawNumber. As instantiating a generic type is not possible in java (like new E(...)), I've created a Factory interface according to this answer.

public interface DrawItemFactory<E> {
    E create(...);
}

Then in the CombinationGenerator<E> class,

public class CombinationGenerator<E> {
    DrawItemFactory<E> factory;

    public CombinationGenerator<E>(DrawItemFactory<E> factory) {
        this.factory = factory;
    }

    public List<E> generate() {
        ......
        list.add(factory.create(...));
        ......
    }
}

And now the DrawNumber class implements DrawItemFactory<DrawItem> interface.

public DrawItem implements DrawItemFactory<DrawItem> {
    protected String getSeperator() {
        return "";
    }

    @Override
    public DrawItem create(...) {
        return new DrawItem(...);
    }
    .......
    // some other methods
}

And I can create CombinationGenerator<DrawItem> class.

DrawItem drawItem = new DrawItem(...);
CombinationGenerator<DrawItem> generator = new CombinationGenerator<DrawItem>(drawItem);
List<DrawItem> combinations = generator.generate();

So far, everything is fine. But when I try to create a DrawNumber class like this,

public DrawNumber implements DrawItemFactory<DrawNumber> {
     ....
}

It gives me the following error:

The interface DrawItemFactory cannot be implemented more than once with different arguments: DrawItemFactory<DrawItem> and DrawItemFactory<DrawNumber>

I've tried this solution but I got the same error. Is there any other way to do this?

解决方案

According to @JB Nizet's comment, I've solved the problem by creating two separate factory classes like this:

public interface ItemFactory<E> {
    E create(int[] values);

    public static class DrawItemFactory implements ItemFactory<DrawItem> {

        @Override
        public DrawItem create(int[] values) {
            return new DrawItem(values);
        }           
    }

    public static class DrawNumberFactory implements ItemFactory<DrawNumber> {

        @Override
        public DrawNumber create(int[] values) {
            return new DrawNumber(values);
        }           
    }
}

In the CombinationGenerator,

public class CombinationGenerator<E> {
    ItemFactory<E> factory;

    public CombinationGenerator<E>(ItemFactory<E> factory) {
        this.factory = factory;
    }

    public List<E> generate() {
        ......
        list.add(factory.create(...));
        ......
    }
}

And instantiated CombinationGenerator like this:

DrawNumber drawNumber = new DrawNumber();
CombinationGenerator<DrawNumber> generator = new CombinationGenerator<DrawNumber>(new ItemFactory.DrawNumberFactory());

List<DrawNumber> combinations = generator.generate();

这篇关于实例化泛型类并实现泛型接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆