任务是:要求您在一家生产和包装面包店的公司中创建质量控制系统,主类的代码片段如下:
// These and its subclasses should pass quality check
class Bakery {}
class Cake extends Bakery {}
// And this and other stuff should not
class Paper {}
// These boxes are used to pack stuff
interface Box<T> {
void put(T item);
T get();
}
// Class you need to work on
class QualityControl {
public static boolean check(List<Box<? extends Bakery>> boxes) {
// Add implementation here
}
}
以以下方式实现检查方法:
如果所有框中的所有对象都属于类 Bakery 或其子类或列表不包含框,则返回 true。
否则返回 false,包括 Box 为空或 List 包含根本不是 Box 的内容的情况。
该方法不应引发任何异常。
我试过这个,但是当列表为空并且我的解决方案似乎不是首选解决方案时,我遇到了麻烦。
class QualityControl {
public static<T> boolean check(java.util.List<T> items) {
if (items.isEmpty()) return true;
if (items == null) return false;
boolean areBoxes = true;
java.util.Set<String> ss = new java.util.HashSet<>();
//Check if all are boxes
for (T item : items) {
java.util.Set<java.lang.reflect.Type> set = new java.util.HashSet<>();
boolean isBox = false;
Class c = item.getClass();
while (c != null) {
for (java.lang.reflect.Type type : c.getGenericInterfaces()) set.add(type);
c = c.getSuperclass();
}
for (java.lang.reflect.Type type : set) {
String boxName = Box.class.getName();
String typeName = type.getTypeName();
if (typeName.startsWith(boxName + "<")) {
isBox = true;
ss.add(typeName);
break;
}
}
areBoxes &= isBox;
}
if (!areBoxes) return false;
//Check if box contain bakery
boolean isIns = true;
for (String s : ss) {
s = s.substring(4);
s = s.substring(0, s.length() - 1);
boolean helper = false;
try {
Class clazz = Class.forName(s);
while (clazz != null) {
if (clazz.equals(Bakery.class)) {
helper = true;
break;
}
clazz = clazz.getSuperclass();
}
isIns &= helper;
helper = false;
} catch (ClassNotFoundException e) {
return false;
}
}
return isIns;
}
}
先检查空,后检查空。 您可以使用实例来检查类型:
class QualityControl {
public static <T> boolean check(java.util.List<T> items) {
if (items == null || items.isEmpty()) {
return false;
}
return items.stream()
.noneMatch(b -> (!(b instanceof Box))
|| !(((Box) b).get() instanceof Bakery));
}
}