[英]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.