java – 我怎么能在地图中说“这两个泛型类型是一样的”?
发布时间:2020-12-15 02:32:06 所属栏目:Java 来源:网络整理
导读:我有一个方法toString(Object),它将转换委托给处理程序.处理程序的定义如下: public interface IToStringServiceT { public String toString( T value );} 代码如下所示: // (1) How can I say that these two wildcards must in fact be the same type?pr
我有一个方法toString(Object),它将转换委托给处理程序.处理程序的定义如下:
public interface IToStringService<T> { public String toString( T value ); } 代码如下所示: // (1) How can I say that these two wildcards must in fact be the same type? private Map<Class<?>,IToStringService<?>> specialHandlers = Maps.newHashMap(); // Generic method,must accept Object (any type really) @Override public String toString( Object value ) { if( null == value ) { return "null"; } Class<?> type = value.getClass(); if( type.isArray() ) { return arrayToString( value ); } // (2) How can I get rid of this SuppressWarnings? @SuppressWarnings( "unchecked" ) IToStringService<Object> handler = (IToStringService<Object>) specialHandlers.get( type ); if( null != handler ) { return handler.toString( value ); } return value.toString(); } public <T> void addSpecialHandler( Class<T> type,IToStringService<T> handler ) { specialHandlers.put( type,handler ); } 一个实现看起来像这样: @SuppressWarnings( "rawtypes" ) // Can't add generics to "Class" or I get compile errors when calling DefaultToStringService.addSpecialHandler() :-( public class ClassToStringService implements IToStringService<Class> { @Override public String toString( Class value ) { return value == null ? "null" : value.getName(); } } 我有几个问题: >我怎么能说specialHandlers映射中的处理程序必须匹配用作键的类型? 解决方法
你不能用Java做到这一点.我会解释原因. ? extends在类型理论中称为存在类型,但Java具有有限的形式. ? extends X意味着存在Y使得Y扩展X.我们可以重写Map< Class<?>,IToStringService<?>>如:
Map<Class<(exists T1 extends Object)>,IToStringService<(exist T2 extends Object)>> 但我们希望: Map<(exists T extends Object Class<T>,IToStringService<T>> 我们无法在Java中表达这一点,因为不能在Java中明确指定存在量词.但是,在Scala中你可以做到这一点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容