加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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映射中的处理程序必须匹配用作键的类型?
>如何在方法中使用相同的信息以避免强制转换和@SuppressWarnings?
>当我更改ClassToStringService以实现IToStringService< Class<?>>时,在调用addSpecialHandler时会遇到编译错误(Class.class,new ClassToStringService());我该如何解决这个问题?

解决方法

你不能用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中你可以做到这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读