如何获得泛型类的“真实”类型?

时间:2010-09-18 02:57:41

标签: java generics

好的问题标题可能没有意义......主要是因为我不知道如何解释它。

这就是我所拥有的:

class SomeClass 
{
    private Class paramType;
    private SomeInterface<?> someObject;
}

public interface SomeInterface<T>
{
    public void foo(T in);
}

变量someObject可能会像这样分配:

someObject = new SomeInterface<Integer> { ... }

我希望能够在someObject上调用泛型方法,如下所示:

someObject.foo(paramType.cast(someVariable));

问题是someObject属于SomeInterface类型。现在,有什么方法可以获得someObjects的REAL类型,以便我可以正确调用该方法吗?

我知道我可以使用反射并执行.getMethod("foo", paramType);之类的操作但是,我不喜欢“foo”必须由客户端硬编码的事实。如果你能找到一种更健壮的方法来调用该方法,我也会对此持开放态度。

有什么想法吗?对不起,如果这不是很有意义...如果您认为可以更好地解释它,请随时编辑:)。

编辑:一些功能性设计,因为我走这条路可能看起来很疯狂:)。

基本上,我正在制作一个允许客户端挂钩某个事件的框架。这方面的一个例子是:

SomeClass.addHandler(Integer.class, new SomeInterface<Integer> {
    public void foo(Integer in)
    {
        // do something
    }});

所以,我基本上是在尝试编写事件触发器功能。采用这种方法的好处是客户端不必担心任何东西,并且具有类型安全性(例如,我可以将addHandler参数限制为SomeInterface<bar>

“调用者”只需要将数据放入适当的对象(简单)并使用该对象调用SomeInterface的方法(硬)。

我几乎已经放弃了,可能只是让客户不得不施展,但我离得太近了!

2 个答案:

答案 0 :(得分:1)

您还需要参数化addHandler()方法。然后演员会工作。

public <T> void addHandler(Class<T> paramType, SomeInterface<T> someObject) {
    someObject.foo(paramType.cast(someVariable));
}

答案 1 :(得分:0)

一般来说,这是不可能的,就像在add()上呼叫List<?>一样。如果您提供更多详细信息和背景,您可能会建议更好的解决方案。

假设问题是这个,给定

SomeInterface<?> x;
Object y;

并且程序员确信它们是兼容的类型,如何调用x.foo(y)。这有效:

((SomeInterface)x).foo(y);

修改

您最好只在实施中使用'原始类型',忘记<?>

泛型为程序员提供了更多表达类型关系的方法,可以由编译器检查。然而,它是有限的,它不能在这个问题中表达类型关系,例如,即使关系看起来简单明了。

这不是世界末日。我们之前没有Generics,我们幸免于难。使用原始类型和静态类型用你的眼睛检查你的程序 - 你比对编译器更了解你的对象类型。