繁体   English   中英

我的通配符实现有什么问题?

[英]What's wrong with my wildcard implementation?

我有3个类(PriorityQueue,Assignment,AssignmentLog)和1个接口(IPriorityQueue)。

public interface IPriorityQueue<T extends Comparable<? super T>> {
void add(T newEntry);
T remove();
T peek();
boolean isEmpty();
int getSize();
void clear(); }

PriorityQueue类:

public class PriorityQueue<T extends Comparable<? super T>> implements IPriorityQueue<T> {

private T[] priorityQueue;
private int frontIndex = 0;
private int backIndex = 0;
private static final int DEFAULT_SIZE= 50;...
}

Assignment.java:

public class Assignment implements Comparable<Assignment> {
private String course;
private String task;
private Date dueDate;
@Override
public int compareTo(Assignment other) {
    return -dueDate.compareTo(other.dueDate);
}}

AssignmentLog.java:

public class AssignmentLog {
private IPriorityQueue<Assignment> log;

public AssignmentLog(){
    log = new PriorityQueue<>();
}

public void addProject(Assignment newAssignment){
    log.add(newAssignment);
}

public Assignment getProject(){
    return log.peek();
}

我的问题是即使IDE无法识别任何错误,当我运行程序时它会显示异常:

Exception in thread "main" java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.Comparable; ([Ljava.lang.Object; and [Ljava.lang.Comparable; are in module java.base of loader 'bootstrap')
    at PriorityQueue.<init>(PriorityQueue.java:13)
    at PriorityQueue.<init>(PriorityQueue.java:9)
    at AssignmentLog.<init>(AssignmentLog.java:5)
    at Main.main(Main.java:13)

第13行: public PriorityQueue(int size){ priorityQueue = (T[])new Object[size]; } public PriorityQueue(int size){ priorityQueue = (T[])new Object[size]; }
第10行: public PriorityQueue(){ this(DEFAULT_SIZE); } public PriorityQueue(){ this(DEFAULT_SIZE); }
第5行: public AssignmentLog(){ log = new PriorityQueue<>(); } public AssignmentLog(){ log = new PriorityQueue<>(); }
第13行: AssignmentLog myHomework = new AssignmentLog();

请解释一下我的任务有什么问题。 我仍然是外卡的新手,所以请给我一些建议

谢谢

您正在将Object[]向下转换为T[] 在Java中向下转换为不是子类的类会抛出ClassCastException的实例。

Javadoc for ClassCastException

抛出以指示代码已尝试将对象强制转换为不是实例的子类。 例如,以下代码生成ClassCastException:

 Object x = new Integer(0); System.out.println((String)x); 

在行priorityQueue = (T[])new Object[size]; ,当您尝试将Object[]T[] ,Java会进行类型检查。 由于Object不扩展T ,因此转换失败。 但是,您必须记住,除Object之外的每个类都隐式扩展Object

如果您要在泛型函数中初始化类型为T的对象,请查看在Java实例化泛型类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM