java - 为什么JAVA在接口(interface)中使用泛型类型时无法编译

标签 java generics

您好,我在 java 中使用泛型类型时遇到问题。实际问题是,当我在方法声明上使用泛型类型时,它工作正常。然后,如果我将泛型类型添加到接口(interface)声明中,代码将无法编译。以下是工作代码:

public interface IRuntimeConvert {
    public <T> T convertInstanceOfObject(String o, Class<T> clazz);
}

public class RuntimeConvertImpl implements IRuntimeConvert {

    private final Map<String, Object> hashMap;

    public RuntimeConvertImpl(Map<String, Object> hashMap) {
        this.hashMap = hashMap;
    }

    @Override
    public <T> T convertInstanceOfObject(String o, Class<T> clazz) {
        try {
            return clazz.cast(hashMap.get(o));
        } catch (ClassCastException e) {
            return null;
        }
    }
}

public static void main(String[] args) {

    Map<String, Object> hashMap = new HashMap<>();
    hashMap.put("s", "string");
    hashMap.put("i", 0);
    hashMap.put("l", 0L);

    IRuntimeConvert rtConvert = new RuntimeConvertImpl(hashMap);

    String s = rtConvert.convertInstanceOfObject("s", String.class);
    System.out.println(s);
    Integer i = rtConvert.convertInstanceOfObject("i", Integer.class);
    System.out.println(i);
    Long l = rtConvert.convertInstanceOfObject("l", Long.class);
    System.out.println(l);
}

上面的代码正在编译中。当我进行以下更改时,代码不可编译。

public interface IRuntimeConvert<S> {

    public <T> T convertInstanceOfObject(String o, Class<T> clazz);

    public S getSomething(S s);
}

public class RuntimeConvertImpl implements IRuntimeConvert<Object> {

    private final Map<String, Object> hashMap;

    public RuntimeConvertImpl(Map<String, Object> hashMap) {
        this.hashMap = hashMap;
    }

    @Override
    public <T> T convertInstanceOfObject(String o, Class<T> clazz) {
        try {
            return clazz.cast(hashMap.get(o));
        } catch (ClassCastException e) {
            return null;
        }
    }

    @Override
    public Object getSomething(Object s) {
        throw new UnsupportedOperationException("Not supported yet."); 
    }

}

在主类中进行上述更改后,我发现每次调用方法 rtConvert.convertInstanceOfObject("s", String.class) 时都会出现类型转换错误,并显示错误消息:

Incompatible types: Object cannot be converted to String.

如果我尝试运行 main,我得到:线程“main”中的异常 java.lang.RuntimeException:无法编译的源代码 - 不兼容的类型:java.lang.Object 无法转换为 java.lang.String

最佳答案

发生这种情况是因为您在实现中将泛型类型指定为 Object,并使用以下行:

public class RuntimeConvertImpl implements IRuntimeConvert<Object> {

因此,对 getSomething 的调用将始终必须返回一个 Object。但是,由于 StringObject 的子类,因此不能自动转换为 String,您必须执行以下操作:

String s = (String) rtConvert.getSomething();

请注意,这不能保证类型安全,并可能导致 ClassCastException

关于java - 为什么JAVA在接口(interface)中使用泛型类型时无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39017626/

相关文章:

java - 如何从另一个类获取有条件分配的值

java - 智能 IDEA : java. lang.ClassNotFoundException

ios - Swift 中的泛型函数参数指向无效内存

c# - 在 C# 中使用 List<T>(泛型)

c# - 在泛型参数上调用扩展方法(例如 "Union")

java - 从java中的列表创建列表

java - 设计一个有效的算法来找到最小化平均距离的邮局位置

java - J2ME应用程序运行时无显示

C# 泛型 - 我可以将此类变成泛型吗?

java - 从两种类型的 Enum 之一实例化 EnumSet