好的问题标题可能没有意义......主要是因为我不知道如何解释它。
这就是我所拥有的:
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的方法(硬)。
我几乎已经放弃了,可能只是让客户不得不施展,但我离得太近了!
答案 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,我们幸免于难。使用原始类型和静态类型用你的眼睛检查你的程序 - 你比对编译器更了解你的对象类型。