在java中扩展包含抽象泛型方法的基类

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)我有兴趣知道解决方案,以防我可以更改基类,我不能更改基类.

在此先感谢您的帮助.此外,如果有任何有用的资源/教程,你可以指出我会很好.再次感谢.

rge*_*man 6

你不能保证object传入MyClassassign方法是一个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)

这是Oracle的Java泛型教程.