簡體   English   中英

對原始值的泛型轉換導致 ClassCastException

[英]Generic Casting on primitive value causing ClassCastException

我在下面有一個方法根據給定的類型對 String 進行強制轉換,假設給定的 String 必須是正確的。

private static <T> T parsePrimitive(final Class<T> primitiveType, final String primitiveValue) {
    if (primitiveType.equals(int.class) || primitiveType.equals(Integer.class)) {
        return primitiveType.cast(Integer.parseInt(primitiveValue));
    }
    /*
    ...
    for the rest of the primitive type
    ...
    */
}

但是,當我調用parsePrimitive(int.class, "10"); ,

primitiveType.cast(Integer.parseInt(primitiveValue));

這會導致ClassCastException ,對此有什么想法嗎?

ps 事實上,當我使用 Object 作為返回類型,並且在返回之前沒有強制轉換時,它在方法之外工作正常,但我認為這不夠通用。

在此先感謝您的幫助。

您正在混淆自動裝箱和鑄造。 java 編譯器將生成字節碼以將您的基元裝箱和拆箱到對象,反之亦然,但這同樣不適用於類型。

  • 裝箱/拆箱 = 變量
  • 鑄造=類型

在您的特定情況下, int.class 和 Integer.class 不能相互分配。

Class<?> intClazz = int.class;
Class<?> integerClazz = Integer.class;
System.out.println(intClazz);
System.out.println(integerClazz);
System.out.println(integerClazz.isAssignableFrom(intClazz));

Output:

int
class java.lang.Integer
false

由於您必須在邏輯中進行大量專門檢查,我不確定是否值得嘗試提出一種將 String 解析為原始值的通用方法。

int.class是 VM 內部 class 與Integer.class 這是一小段代碼,用於顯示 int.class 和 Integer.class 之間的差異。

import java.lang.reflect.Modifier;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        dump(int.class);
        System.out.println("---");
        dump(Integer.class);
    }

    private static void dump(Class<?> c) {
        System.out.printf(
            "Name: %s%n" +
            "Superclass: %s%n" +
            "Interfaces: %s%n" +
            "Modifiers: %s%n",
            c.getName(),
            c.getSuperclass() == null ? "null" : c.getSuperclass().getName(),
            Arrays.asList(c.getInterfaces()),
            Modifier.toString(c.getModifiers()));
    }
}

輸出:

Name: int
Superclass: null
Interfaces: []
Modifiers: public abstract final
---
Name: java.lang.Integer
Superclass: java.lang.Number
Interfaces: [interface java.lang.Comparable]
Modifiers: public final

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM