繁体   English   中英

从通用 object 中提取 Java 类型

[英]Extract Java Type from generic object

我正在创建一个 class ,其中包含许多类似于片段中的 getCategories() 方法的方法。 有没有办法制作一种方法来获取我需要的下一个操作动态的类型 object,而不是为其他类似方法键入和重复自己。

import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.List;

...

    public static void getCategories(CategoriesCallback<List<Category>> callback) {
        //Need to create a method to get Type from the callback object instead of manually typing it
        Type type = new TypeToken<List<Category>>() {}.getType();
        //Requires Callback and Type
        performOperation(callback, type);
    }

    //e.g.
    public static void getBooks(BooksCallback<List<Book>> callback) {
        //Need to create a method to get Type from the callback object instead of manually typing it
        Type type = new TypeToken<List<Book>>() {}.getType();
        //Requires Callback and Type
        performOperation(callback, type);
    }

...

是的,可以开发由 CategoriesCallback 和 BooksCallback 扩展的基本通用 class。 你会有这样的东西

public class BaseCallback<T> {
}

这些是那些类:

public class BooksCallback<Book> extends BaseCallback<List<Book>>{
}
public class CategoriesCallback<Category> extends BaseCallback<List<Category>>{
}

现在您可以拥有自己的基本通用方法,如下所示:

public static void getCallbacks(BaseCallback<List<?>> callback) {
        
}

需要创建一个方法从回调 object 中获取 Type 而不是手动输入

这是一个常见问题解答。 这样做的唯一方法是 hack,并且由于 Java 使用类型 erasure而被认为是 back form。 该集合不知道持有什么类型,因为该信息仅在编译时可用。

如果您真的需要该类型,那么我会将其传递给您的方法:

public static <T> void getCategories(CategoriesCallback<List<T>> callbackList,
      Class<T> clazz) {

然后你会这样称呼它:

List<Foo> callbackList = ...
getCategories(callbackList, Foo.class);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM