Java泛型地狱般地传入,但它需要类型T

Java泛型地狱般地传入,但它需要类型T,java,generics,Java,Generics,我目前正在开发一个轻量级的通用模拟框架。目标是允许人们根据其特定领域的需求对仿真和场景对象进行子类化。仿制药似乎是实现这一目标的合适方式,但我担心我可能会陷入仿制药的地狱 Sim对象提供对仿真实体的访问并控制Sim(启动/暂停/停止) 场景对象允许您使用模拟实体填充Sim卡 Sim卡: 具体地说,使用上面的代码,scenario.load(this)调用Sim.loadScenario会给我一个错误:类型场景中的方法load(T)不适用于参数(Sim)。我理解这是因为我正在加载this(类型为S

我目前正在开发一个轻量级的通用模拟框架。目标是允许人们根据其特定领域的需求对仿真和场景对象进行子类化。仿制药似乎是实现这一目标的合适方式,但我担心我可能会陷入仿制药的地狱

Sim
对象提供对仿真实体的访问并控制Sim(启动/暂停/停止)

场景
对象允许您使用模拟实体填充Sim卡

Sim卡:

具体地说,使用上面的代码,
scenario.load(this)
调用
Sim.loadScenario
会给我一个错误:类型场景中的方法load(T)不适用于参数(Sim)。我理解这是因为我正在加载
this
(类型为
Sim
),而需要的是
T扩展Sim
,这意味着我应该以某种方式传入一个可以是Sim的任何子类型的对象


如何纠正这个问题以实现我想要实现的目标?或者,这有可能吗?也许泛型不能为我做到这一点。

如果它总是要成为Sim的一个子类型,那么为什么不在方法中指定它并使用它呢?在这里,仿制药似乎不太能吸引你

但无论如何,我认为您希望
loadScenario
成为:

public void loadScenario(Scenario<? extends Sim> scenario)
public void加载场景(场景
我明白这是因为我
正在加载此(Sim类型)
需要的是T扩展Sim卡
这意味着我应该
传递一个可以是任意形状的对象
Sim的子类型

否。问题是,根据方法规范,您应该传递一个类为
T
的对象,这是与您的场景匹配的
Sim
的特定子类,而
this
不是(至少该代码不能保证它是)


不知道如何解决这个问题。

我想这可能与我问的一个关于循环泛型引用的问题有关:在最后一种情况下,你的意思肯定是
load(T sim)
?否则类上的泛型参数就没那么有用了…:-)@Andrzej不,我相信他是指load(sim sim)。事实上,类上的泛型已不再有用。感觉上我无法完成我想做的事情。@Andrzej和@Brad。正确,泛型没有那么有用,这是评论第一部分的要点:-)正常多态性在这里应该同样有效。但是问题仍然存在。“是否可以使用泛型来实现这一点,这样我就不必在运行时强制强制转换?”Brad。你不能用你已经做过的方式去做。这可能是一种静态方法。请参见编辑。
public interface Scenario<T extends Sim>
{
    public void load(T sim);
}
public class MyScenario<MySim>
{
    public void load(MySim sim)
    {
        // make calls to sim.addMySimEntity(...)
    }
}
public void loadScenario(Scenario<? extends Sim> scenario)
public interface Scenario<T extends Sim>
{
    public void load(Sim sim);
}
public class Sim
{
    public static <T extends Sim> void loadScenario(Scenario<T> scenario, T sim)
    {
        scenario.load(sim);
    }
}