cha*_*ick 2 java generics abstract java-7
我得到一个像这样的基类:
Class MyBase{
public abstract <T> Student assign (T object);
}
Run Code Online (Sandbox Code Playgroud)
我正在扩展如下:
Class MyClass extends MyBase{
@Override
public abstract <T> Student assign (T object){
Student stew = new Student();
......
}
}
Run Code Online (Sandbox Code Playgroud)
我的用途是:传入的对象应该是Teacher类型.在方法中我想创建一个新的Student,它将通过调用Teacher上的函数来获取一些值.(例如,stew.setTeacherName = teacher.getName();)然后将Student返回给调用者.
问题:a)我如何获得预期的行为?b)宣布MyBase当前的方式与做MyBase之间的区别是什么?c)我有兴趣知道解决方案,以防我可以更改基类,我不能更改基类.
在此先感谢您的帮助.此外,如果有任何有用的资源/教程,你可以指出我会很好.再次感谢.
你不能保证object传入MyClass的assign方法是一个Teacher,如果MyBase这样定义的话.如果允许修改MyBase,请执行以下操作:
abstract class MyBase
{
public abstract <T extends Teacher> Student assign (T object);
}
Run Code Online (Sandbox Code Playgroud)
并与您的课程一起扩展:
class MyClass extends MyBase
{
@Override
public <T extends Teacher> Student assign (T object){
Student stew = new Student();
......
}
}
Run Code Online (Sandbox Code Playgroud)
这将保证object传入的是一个Teacher,即使它实际上是一个子类的实例Teacher.
编辑:另一种修改方式MyBase.使泛型参数成为类定义的一部分而不是方法定义.
abstract class MyBase<T extends Teacher>
{
public abstract Student assign (T object);
}
class MyClass<T extends Teacher> extends MyBase<T>
{
@Override
public Student assign (T object)
{
Student stew = new Student();
......
}
}
// Could also do this...
class MyClass2 extends MyBase<Teacher>
{
@Override
public Student assign (Teacher object)
{
Student stew = new Student();
......
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13991 次 |
| 最近记录: |