Java多边界

时间:2015-01-01 11:18:22

标签: java generics boundary

我想要做的是如下: 假设getClassFromString()getAllObjectsFromRepositoryByClass()已经存在。
为什么我不能使用Class<T extends Named & HasId>

我尝试对类本身进行泛化,但不能使用T.class等等。

public interface Named   {    String getDisplayName(); }
public interface HasId   {    String getId();          }


public class Foo {

public List<PairItem>  getPairItems(String typeId) {

    Class<T extends Named & HasId> clazz = getClassFromString(typeId);

    List<T> allObjects = getAllObjectsFromRepositoryByClass(clazz);

    List<PairItem> items = new ArrayList<>();
    for (clazz obj : allObjects) {
        items.add(obj.getDisplayName(),ibj.getId());
    }

    return items;
}         

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式更改Foo - 课程:

public class Foo {

    public <T extends Named & HasId> List<PairItem> getPairItems(String typeId) {
        Class<?> classFromString = getClassFromString(typeId);
        // Java 8 seems to be unable to chain asSubclass-calls. These are merely to verify our unchecked cast
        classFromString.asSubclass(Named.class);
        classFromString.asSubclass(HasId.class);
        //noinspection unchecked
        return getPairItems((Class<T>) classFromString);
    }

    public <T extends Named & HasId> List<PairItem> getPairItems(final Class<T> clazz) {

        List<T> allObjects = getAllObjectsFromRepositoryByClass(clazz);

        List<PairItem> items = new ArrayList<>();
        for (T obj : allObjects) {
            items.add(new PairItem(obj.getDisplayName(), obj.getId()));
        }

        return items;
    }

}

这可以解决多个边界的问题,因为它们只允许每documentation个类型参数。我想那也是

  

如果其中一个边界是一个类,则必须先指定它。

导致asSubclass() - 调用无法链接的问题,否则我们可以删除未经检查的强制转换。

第二种方法可以从这样的流式API中获益:

    public <T extends Named & HasId> List<PairItem> getPairItems(final Class<T> clazz) {
        List<T> allObjects = getAllObjectsFromRepositoryByClass(clazz);

        return allObjects.stream()
                         .map(obj -> new PairItem(obj.getDisplayName(), obj.getId()))
                         .collect(Collectors.toList());
    }

总的来说,我假设你想要实例化PairItem并拆分方法,以便有一个未经检查和完全检查的部分。