我正在研究设计问题,我必须设计一副纸牌。这是我的班级样子

public interface ISuit {
    String getLogo();
    String getName();
}

public interface Icard<T extends ISuit> {
    T getSuit();
    String getNumber();
}


现在,我想为13张卡片中的每张卡片写一个类,类似

public  class Queen<E extends ISuit> implements Icard<E> {
    @Override
    public String getNumber() {
        return "12";
    }

    @Override
    public E getSuit() {
        return new E;
    }

}


我打算像这样创建女王的对象
1:Queen<Hearts> queenOfhearts = new Queen<Hearts>();

但是,对于我的皇后班,我的getSuit出现编译时错误。我不知道getSuit的定义是什么。是否应该将此函数抽象化?

最佳答案

在运行时,如果要实例化通用类型T,则必须具有Class<T>对象。

您可以将getSuit(..)方法的签名更改为:

public E getSuit(Class<E> clazz);


然后,实现将是:

public E getSuit(Class<E> clazz) {
    try {
        return clazz.newInstance();
    } catch (InstantiationException | IllegalAccessException e) {
    // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}


更好的是,为了摆脱方法的Class<T>参数,可以将其传递给类的构造函数,并将其持久化为私有成员。例如:

public  class Queen<E extends ISuit> implements Icard<E> {
    private Class<E> clazz;

    public Queen(Class<E> clazz) {
        this.clazz = clazz;
    }

    public String getNumber() {
        return "12";
    }

    public E getSuit() {
        try {
            return clazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

10-08 19:31