簡體   English   中英

嘗試獲取泛型類時ClassCastException

[英]ClassCastException when trying to get the generic type class

我試着使用這個答案中給出的代碼。 我這樣做了:

public class ListClass<T> {
  private class ObjectFactory<T> {
    //This should the the class of generic type T which is what I need
    public final Class<T> cls;
    @SuppressWarnings ("unchecked")
    public ObjectFactory()
    {
      //This three lines are from the linked answer - I don't really understand them
      Type type = getClass().getGenericSuperclass();
      ParameterizedType paramType = (ParameterizedType) type; //java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
      cls = (Class<T>) paramType.getActualTypeArguments()[0]; 
    }
    public T createNew(... some parameters ...) {
      return (T)new Expression(cls, "new", new Object[]{... some parameters ...}).getValue();
    }
  }
  public final ObjectFactory<T> factory = new ObjectFactory<T>();

  public generateItem() {
    //let add() be method that adds item of type T to this list
    this.add(factory.createNew(... some parameters ...));
  }
}

我錯了什么?

只有在使用如下具體參數對參數化類時,此方法才有效:

class Sub extends Super<String> {}

然后通過擴展:

new Super<String>() {}

但不是這樣的:

class Sub<T> extends Super<T> {}

而不是這樣:

<T> Super<T> m() {
    return new Super<T>() {};
}

使用getActualTypeArguments的能力是類的屬性,而不是實例,因此該類需要實際的類型參數才能使用它。


根據您的編輯,我建議您做的是為此創建一個幫助程序:

static <T> Class<T> getActualTypeArgument(Class<?> clazz, int i) {
    Type superclazz = getClass().getGenericSuperclass();
    ParameterizedType paramType = (ParameterizedType) superclazz;

    @SuppressWarnings("unchecked")
    final Class<T> actual =
        (Class<T>) paramType.getActualTypeArguments()[i];
    return actual;
}

然后在ListClass上使用它:

class ListClass<T> {
    private ObjectFactory<T> factory = new ObjectFactory<T>(
        getActualTypeArgument(this.getClass(), 0));
}

並以下列方式創建ListClass

ListClass<GameObject> list =
    new ListClass<GameObject>() {};

還要考慮只傳遞Class<T>

class ListClass<T> {
    private ObjectFactory<T> factory;

    ListClass<T>(Class<T> type) {
        factory = new ObjectFactory(type);
    }

    static <T> ListClass<T> of(Class<T> type) {
        return new ListClass<T>(type);
    }
}

ListClass<GameObject> list =
    ListClass.of(GameObject.class);

Class#getGenericSuperClass()上引用文檔:

回答表示接收者超類的類的類型。 對於表示基類型,接口和java.lang.Object的類,該方法應答null。

ObjectFactory<T>類上調用它將返回Object類型,該類型不是ParameterizedType

暫無
暫無

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

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