【发布时间】:2011-01-18 02:27:28
【问题描述】:
这是我想在我的 java 代码中写的内容:
private <A extends Action<R>, R extends Result> MyType<A,R> member;
然而,这是无效的语法。所以我最终写了:
private MyType<? extends Action<? extends Result>, ? extends Result> member;
但这忽略了从Result 派生的两个类是相同的事实。我的类方法都强制执行这种关系,所以我可以确定 MyType 强制执行它,但在某些情况下我仍然必须不安全地类型转换 member。
更多详情
这是我想要做的精确版本,虽然它更严格:
我希望我能做到:
private <A extends Action<R>, R extends Result>
Map< Class<A>, ActionHandler<A,R> > handlers;
相反,我必须这样做:
private Map< Class< ? extends Action<? extends Result> >,
ActionHandler<? extends Action<? extends Result>,
? extends Result> > handlers;
我的方法强制执行所需的关系,如下所示:
public <A extends Action<R>, R extends Result> void addHandler(
ActionHandler<A, R> handler ) {
handlers.put( handler.getActionType(), handler );
}
我想要以下方法:
public <A extends Action<R>, R extends Result> ActionHandler<A, R>
findHandler( A action ) {
return handlers.get( action.getClass() );
}
但这不起作用:我必须添加演员表和@SuppressWarnings("unchecked")。
我尝试过的事情
我尝试为此目的创建一个新类:
public class MyMap <A extends Action<R>, R extends Result> extends
HashMap< Class<A>, ActionHandler<A,R> > { ... }
MyMap< ?, ? > handlers;
但它不起作用,我仍然需要演员表。
【问题讨论】:
-
你不能对这样的类型进行参数化。事件
private <T> List<T> ts;无效。您能更清楚地了解您正在尝试做什么吗?像“Map<T, Class<T>>”这样的东西,其中T对于每个条目来说都是一样的? -
我知道我不能这样做,使用那个(无效的)语法更容易解释。我已经添加了详细信息。
-
完全正确:我希望 T 是通用的,但关系应该适用于地图中的每个条目。
-
有趣的是,
public class Test<T, A> where A : EventArgs where T : TestArgs<A>在 C# 中运行良好。尽管语法看起来几乎完全相同,但完全不同的泛型实现是耶! -
@Tanzelax 这也适用于 Java(我已经更新了我的问题以显示示例)。问题在于声明一个变量,该变量想要强制泛型之间的关系。