我不喜欢使用类型通配符,因为它们限制太多。比如说,检查这个代码示例:
List<? extends Number> listExtendsNumber = new ArrayList<>(Arrays.asList(1, 2, 3));
Number num = new Integer(1);
listExtendsNumber.add(num); // compile error - you can't add stuff
listExtendsNumber.add(1); // compile error - you can't add stuff
有时你真的想变得如此严格。但是,我发现使用绑定通配符类型的人通常想要别的东西。
您需要确定是否要接受扩展Intent 和Timmed 的任何 类型,还是只接受一种特定类型?
据我所知,您有以下选择:
1。 Set 周围的包装器
您可以指定处理一种特定类型的包装器:
public class TimmedIntentSet<T extends Timmed & Intent> implements Set<T> {
private Set<T> set = new HashSet<>();
// consider defining constructors other than the default
@Override
public int size() {
return set.size();
}
@Override
public boolean isEmpty() {
return set.isEmpty();
}
// ... more delegator methods
}
这可以非常灵活。例如,考虑以下类型:
public interface Timmed {}
public interface Intent {}
public interface TimmedIntent extends Timmed, Intent {}
public class TimmedIntentClass implements TimmedIntent {}
public class TimmedAndIntent1 implements Timmed, Intent {}
public class TimmedAndIntent2 implements Timmed, Intent {}
如果您对某些类型检查警告感到满意,那么您几乎可以用这个TimmedIntentSet 做任何事情:
TimmedIntentSet tis = new TimmedIntentSet<>(); // warning
tis.add(new TimmedAndIntent1()); // warning
tis.add(new TimmedAndIntent2()); // warning
tis.add(new TimmedIntentClass()); // warning
tis.add(2); // compile error
但是,如果您不想 @Suppress 您的警告,那么您会看到很多限制:
TimmedIntentSet<TimmedIntentClass> tis = new TimmedIntentSet<>();
tis.add(new TimmedAndIntent1()); // compile error
tis.add(new TimmedAndIntent2()); // compile error
tis.add(new TimmedIntentClass()); // cool
tis.add(2); // compile error
2。将 Set 添加到使用它的类中
您可以在上面刚刚指定的类中添加一个 Set。这接受一种特定类型:
class RescheduableRunnableIntent<T extends Intent & Timmed> implements Runnable{
IntentManager intentManager;
T intent;
Set<T> intentMap;
}
您可以定义Timmed 和Intent 的新类型,但有其他类型的限制。使用与上述相同的类型,您不能只将任何 Timmed 和 Intent -s 添加到您的集合中:
Set<TimmedIntent> set = new HashSet<>();
set.add(new TimmedAndIntent1()); // compile error
set.add(new TimmedAndIntent2()); // compile error
set.add(new TimmedIntentClass()); // only this is fine
总结:
这一切都归结为你想做什么?几乎一切皆有可能,但每种选择都需要权衡取舍。