Java 将抽象/泛型对象传递给方法

Java 将抽象/泛型对象传递给方法,java,generics,Java,Generics,我有一个抽象类: public abstract class AdvancedModel<T, K> 公共抽象类高级模型 它有两个子类: public class TrackModel extends AdvancedModel<Track, Toptracks> 公共类TrackModel扩展了AdvancedModel 及 公共类ArtistModel扩展了AdvancedModel 在一个名为Evaluation的单独类中,我希望有一个方法,可以接收这些对

我有一个抽象类:

public abstract class AdvancedModel<T, K>
公共抽象类高级模型
它有两个子类:

public class TrackModel extends AdvancedModel<Track, Toptracks>
公共类TrackModel扩展了AdvancedModel

公共类ArtistModel扩展了AdvancedModel

在一个名为Evaluation的单独类中,我希望有一个方法,可以接收这些对象中的任何一个,并对其进行处理。有没有办法使用泛型类型来实现这一点,或者我必须使用两个不同的类作为参数使用相同的方法两次

编辑

我试过了

private <T, K> float runModel(AdvancedModel<T, K> testEngine)
private float运行模型(AdvancedModel测试引擎)
当我在前面声明对象时,这似乎是可行的,如:

AdvancedModel<Track, Toptracks> name = new TrackModel(10, 17);

float result = runModel(name);
AdvancedModel name=新的TrackModel(10,17);
float result=runModel(名称);

但是,这会在以后导致其他方法出现问题。例如,我还有一个方法,我想从K调用getArtister()或getTrack(),这取决于K是Toptracks还是Topartists

您应该向方法声明中添加类型参数,如下所示:

public <T, K> void doStuffWithAdvancedModel(AdvancedModel<T, K> model) {
    // do stuff here
}
AdvancedModel公共作废文件(AdvancedModel){
//在这里做事
}

您应该向方法声明中添加类型参数,如下所示:

public <T, K> void doStuffWithAdvancedModel(AdvancedModel<T, K> model) {
    // do stuff here
}
AdvancedModel公共作废文件(AdvancedModel){
//在这里做事
}

“我希望有一个方法可以接受这两个对象中的任何一个并使用它进行操作”-是的,你可以这样做,但除非你指定你想做什么样的“操作”-我们不能真正帮助你…你可以使用基本类它取决于你的方法在做什么。如果它能够在不知道
T
K
的情况下操作基类,它可以接受
AdvancedModel
。请说明您在使用其他方法时遇到的其他问题在不了解更多详细信息的情况下很难评估,但任务可能需要根据参数类型调用不同的方法这一事实表明,这两个类可能应该有一个公共接口或超类,并且提供相同的操作
get
getElement
或类似的操作,然后该方法只需要调用
get
任何输入。“我想有一个方法,可以接收这些对象中的任何一个,并对其进行填充”-是的,你可以,但除非你指定什么类型的“填充”你想做的-我们不能真正帮助你…你可以使用基本classIt取决于你的方法在做什么。如果它能够在不知道
T
K
的情况下操作基类,它可以接受
AdvancedModel
。请说明您在使用其他方法时遇到的其他问题在不了解更多详细信息的情况下很难评估,但任务可能需要根据参数类型调用不同的方法这一事实表明,这两个类可能应该有一个公共接口或超类,并且提供相同的操作
get
getElement
或类似的操作,然后该方法只需调用
get
任何输入。我尝试了私有浮点运行模型(AdvancedModel testEngine),当我早些时候声明对象时,它似乎起作用,比如:AdvancedModel name=new TrackModel(10,17);float result=runModel(名称);但是,这会在以后导致其他方法出现问题。例如,我还有一个方法,我想从K调用getArtister()或getTrack(),这取决于K是Toptracks还是Topartists?泛型(如名称所示)用于泛化。如果您需要处理一些特定类型,如
Toptracks
Topartists
并调用它们的特定方法,您应该创建单独的方法,将
Toptack
Topartist
作为参数当我在前面声明对象时,它似乎起作用了,比如:AdvancedModel name=new TrackModel(10,17);float result=runModel(名称);但是,这会在以后导致其他方法出现问题。例如,我还有一个方法,我想从K调用getArtister()或getTrack(),这取决于K是Toptracks还是Topartists?泛型(如名称所示)用于泛化。如果您需要处理一些特定类型,如
Toptracks
topaists
并调用它们的特定方法,您应该创建单独的方法,将
Toptack
topaister
作为参数。