我想要做的是如下:
假设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;
}
答案 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
并拆分方法,以便有一个未经检查和完全检查的部分。