如何动态转换为泛型类型

时间:2017-08-28 12:06:09

标签: java generics javafx annotations

我有以下2个类BaseObject:

public class BaseObject
{
    private String name;

    public String getName()
    {
       return name;
    }

    public static Predicate<? extends BaseObject> isNameEqualTo(String test) 
    {
         return p -> p.getName().equals(test);
    }
}

和用户:

public class User extends BaseObject
{
     private String firstName;

     public static Predicate<? extends User> isFirstNameEqualTo(String test) 
     {
          return p -> p.getFirstName().equals(test);
     }
}

我想要达到的目的是让用户打开对话框并过滤表格中的数据。该表由ObservableList<? extends BaseObject>支持的FilteredList组成。因此,当用户打开对话框时,应该有list,table,...包含所有可过滤的字段,如firstname,lastname等。每个扩展BaseObject的类都应该提供返回Predicate的静态方法如下

@FilterableField(name="firstName")
public static Predicate<? extends User> isFirstNameEqualTo(String test) 
{
    return p -> p.getFirstName().equals(test);
}

注释@FilterableField用作指示字段是否可过滤以及作为字段本身元信息的容器。现在我的问题是使用反射我无法使用以下(test!)代码将Predicate强制转换为Predicate<? extends User>

Set<Method> allMethods = ReflectionUtils.getAllMethods(User.class);
    Map<FilterableField, Method> annotatedMethods = new HashMap<>();
    for(Method m : allMethods)
    {
        FilterableField annotation = m.getAnnotation(FilterableField.class);
        if(annotation == null)
        {
            continue;
        }
    annotatedMethods.put(annotation, m);
}
annotatedMethods.forEach((k,v)->{
    System.out.println("Annotation : " + k.name() + " Method : " + v.getName());
if(k.name().equals("name"))
        {
            try
            {
                //Class clz = v.getDeclaringClass();
                Class clz = Class.forName("Predicate<User>");
                Predicate test = (Predicate<?>)v.invoke(null, "Hans");
                clz.cast(test);
                List<User> users = new ArrayList<User>();
                User user = new User();
                user.setName("Hans");
                users.add(user);
                user = new User();
                user.setName("Werner");
                users.add(user);
                List<User> dummy = users.stream().filter(test).collect(Collectors.toList());
                System.out.println("Main.reflectionPredicateTest - dummy: "+dummy);
            }
            catch (IllegalAccessException e)
            {
                e.printStackTrace();
            }
            catch (InvocationTargetException e)
            {
                e.printStackTrace();
            }
            catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
        }
    });

因此,如果有人对如何实现这一点以及/或如何动态地将类实例强制转换为类似Predicate<? extends User>的内容有一些想法,那么我会非常感激!

0 个答案:

没有答案