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

在java中扩展包含抽象泛型方法的基类,java,generics,java-7,abstract,Java,Generics,Java 7,Abstract,我被赋予这样一个基类: Class MyBase{ public abstract <T> Student assign (T object); } 类MyBase{ 公开摘要学生分配(T对象); } 我将其扩展如下: Class MyClass extends MyBase{ @Override public abstract <T> Student assign (T object){ Student stew = new

我被赋予这样一个基类:

 Class MyBase{

   public abstract <T> Student assign (T object);

 }
类MyBase{
公开摘要学生分配(T对象);
}
我将其扩展如下:

 Class MyClass extends MyBase{

   @Override
   public abstract <T> Student assign (T object){

     Student stew = new Student();
     ......

   }
 }
Class MyClass扩展了MyBase{
@凌驾
公共摘要学生分配(T对象){
学生炖肉=新学生();
......
}
}
我的预期用途是:传入的对象应为Teacher类型。在这个方法中,我想创建一个新的Student,它将通过调用Teacher上的函数来获得一些值。(例如,stew.settacherName=teacher.getName();),然后将Student返回给调用方

问题: a) 我如何获得预期的行为? b) 以当前方式声明MyBase与使用MyBase有什么区别? c) 我感兴趣的是在我可以更改基类而不能更改基类的情况下了解解决方案


提前感谢你的帮助。此外,如果有任何有用的资源/教程,您可以向我指出,这将是伟大的。再次感谢

泛型方法通常用于所提供的任何类型,而泛型类可以专门用于具体类型。这是一种功能vs OO方法。因此,您可能希望有一个带有T参数的泛型类:

MyBase

让方法使用该参数

公开摘要学生分配(T对象)

然后将其专门用于教师

MyClass扩展了MyBase

带着

公共学生分配(教师对象)


我的泛型方法大多是静态的,正是因为这个原因——如果实例方法是参数化的,那么类型参数属于类而不是方法是合乎逻辑的。当然,通常。

如果
MyBase
是这样定义的,则不能保证传递给
MyClass
assign
方法的
对象是
Teacher
。如果允许您修改
MyBase
,请执行以下操作:

abstract class MyBase
{
   public abstract <T extends Teacher> Student assign (T object);
}

这里有一个问题。

如果您不能修改基类,那么实际上没有涉及泛型的方法。你可以做两件事。首先,检查对象的运行时类型,如果是教师,则执行一项操作,如果不是,则执行另一项操作

public class MyClass extends MyBase {
    @Override public <T> Student assign(T object) {
        Student student = new Student();
        if (object instanceof Teacher) {
            Teacher teacher = (Teacher) object;
            student.setTeacherName(teacher.getName());
        } else {
            student.setTeacherName("unknown");
        }
        return student;
    }
}
调用方法时,如果编译时类型为Teacher,编译器将选择更具体的方法重载:

public class Main {
    /**
     * Gets a teacher but calls it an Object.
     *
     * @return an Object that happens to be a Teacher
     */
    public static Object getTeacher() {
        return new Teacher();
    }

    public static void main(String[] args) {
        /** A Teacher, and is declared as such */
        Teacher teacher = new Teacher();

        /**
         * Some Object, which just so happens to actually
         * be a Teacher (but the compiler can't see that)
         */
        Object something = getTeacher();

        MyClass mc = new MyClass();

        Student withTeacher = mc.assign(teacher);
        Student withoutTeacher = mc.assign(something);
    }
}
然而,我更喜欢修改MyBase的解决方案之一

编辑以添加:您实际上可以将第二个更具体的
assign
方法声明为泛型方法,如下所示:

public <T extends Teacher> Student assign(T object) {
    Student student = new Student();
    student.setTeacherName(object.getName());
    return student;
}
它看起来更像是基类中方法的重写,因为它有一个泛型类型变量,参数名为
object
,而不是
teacher
。但是尝试在其上粘贴一个
@Override
注释,编译器将告诉您它不会重写或实现来自超类型的方法


你仍然有
泛型方法,它不设置教师名称,如果你有一个没有声明为教师的教师对象,编译器会选择错误的重载,你会挠头想为什么,如果这个对象是教师,老师的名字没有给学生起作用。

谢谢你的回复。但是如果我不能修改基类呢?
public class MyClass extends MyBase {
    @Override public <T> Student assign(T object) {
        return new Student();
    }

    public Student assign(Teacher teacher) {
        Student student = new Student();
        student.setTeacherName(teacher.getName());
        return student;
    }
}
public class Main {
    /**
     * Gets a teacher but calls it an Object.
     *
     * @return an Object that happens to be a Teacher
     */
    public static Object getTeacher() {
        return new Teacher();
    }

    public static void main(String[] args) {
        /** A Teacher, and is declared as such */
        Teacher teacher = new Teacher();

        /**
         * Some Object, which just so happens to actually
         * be a Teacher (but the compiler can't see that)
         */
        Object something = getTeacher();

        MyClass mc = new MyClass();

        Student withTeacher = mc.assign(teacher);
        Student withoutTeacher = mc.assign(something);
    }
}
public <T extends Teacher> Student assign(T object) {
    Student student = new Student();
    student.setTeacherName(object.getName());
    return student;
}
public Student assign(Teacher)