gpt4 book ai didi

java - java generic编译时错误背后的解释?

转载 作者:行者123 更新时间:2023-12-01 12:30:27 27 4
gpt4 key购买 nike

我正在研究设计问题,我必须设计一副纸牌。这是我的类(class)的样子

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;
}

}

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

但是,对于我的 Queen 类,我的 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>方法的参数,您可以将其传递给类的构造函数并将其持久化为私有(private)成员。例如:

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;
}
}

关于java - java generic编译时错误背后的解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25957204/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com