java - 我怎么能在 map 上说 "these two generic types are the same"?

标签 java generics

我有一个方法 toString( Object )它将转换委托(delegate)给处理程序。处理程序定义如下:

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();
    }
}

我这里有几个问题:

  1. 我怎么能说 specialHandlers 中的处理程序呢? map 必须匹配用作键的类型?

  2. 如何在方法中使用相同的信息来避免转换和 @SuppressWarnings ?

  3. 当我改变ClassToStringService实现IToStringService<Class<?>> ,调用 addSpecialHandler( Class.class, new ClassToStringService() ); 时出现编译错误我该如何解决这个问题?

最佳答案

您不能在 Java 中执行此操作。我会解释为什么。 ? extends 在类型论中被称为存在类型,但 Java 的形式有限。 ? extends X 意味着存在 Y 使得 Y extend 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 中,您可以这样做。

关于java - 我怎么能在 map 上说 "these two generic types are the same"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9569475/

相关文章:

Java - 循环创建 Action 监听器

java - Dojo 1.7 eclipse错误

java - 函数处理后变量未更新

Android:我可以在 AsyncTask 中使用通用返回类型吗 - doInBackGround

c# - 用泛型对象初始化非泛型对象

database - 从数据库获取数据并填充数组的Golang抽象函数

java - 如何使用字节数组作为参数构建 FileInputStream 对象

java - 如何检查链表中的多个值?

Java Swing - 如何处理 ActionListener 中的泛型

JAVA泛型类方法不适用