我正在研究设计问题,我必须设计一副纸牌。这是我的班级样子
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;
}
}