繁体   English   中英

java泛型通配符没有按预期工作

[英]java generic wildcard not working as expected

下面显示的代码用于解释通用通配符的用法。

我有一个Student家长班和Dayscholar孩子班。 我有一个Record<Student>类,它维护一个 Student/Dayscholar 对象列表和一个名为display的方法,它接受Record<? extends Student> Record<? extends Student>并显示列表。 这适用于Record<Student>Record<Dayscholar> 根据我从课程中了解到的情况,通配符是必需的。 这意味着如果display方法的声明更改为display(Record<Student>)该方法将不接受参数Record<Dayscholar>并将发出编译时错误。

但是将显示方法声明为display(Record<Student> somename)对于 Student 类型或 Dayscholar 类型的记录同样有效。 我很困惑。 演示通用通配符的最佳示例是什么?

class Record<Student>//<Number>
{
  List<Student> record =new ArrayList<>();

  @Override
  public String toString() {
    return "Record [record=" + record + "]";
 }
  public void add(Student e)
 {  
    record.add(e);
 }
  public void display(Record< Student> record) {
    System.out.println("student record:"+record);
 }
 }

class Student
{
int id;
String name;

public Student(int id,String name)
{
    this.id=id;
    this.name=name;
}
@Override
public String toString()
{
    return "Id = "+id+" Name = "+name;
}
}

 class Dayscholar extends Student
{
  float stipend;

 public Dayscholar(int id,String name,float stipend)
{
    super(id,name);
    this.stipend=stipend;
}
@Override
public String toString()
{
    return "Id = "+id+" Name = "+name+" Stipend = "+stipend;
}
}
class WildcardsDemo
{   
    public static void main(String[] args)
 {
  Record<Student> studentrecord = new Record<>();

  studentrecord.add(new Student(9999,"hassan"));

 studentrecord.display(studentrecord);

 Record<Dayscholar> dayscholar = new Record<>();

 dayscholar.add(new Dayscholar(2222,"Sam",900));

 dayscholar.display(dayscholar);     

}
}

直到几个小时前(现在是美国东部时间晚上 11 点)我再次运行代码时,我的帖子中的所有内容都是正确的。 我在培训课程的操场上运行了代码,事实证明外卡令我感到惊讶。 我不知道怎么解释这个。 是我的笔记本电脑/浏览器正在缓存以前的良好运行吗? 我希望这不会被视为反对我的观点。

暂无
暂无

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

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