Tag: 有界通配符

是否需要在直通方法中使用有界通配符generics?

我知道在Collection中的以下方法中: public void addAll(Collection subcollection); 我们用Collection Collection允许一个仅存在子元素的集合,例如: List drivables = new ArrayList(); List cars = new ArrayList(); //we need the wildcard here, because of the following line: drivables.addAll(cars); 但是,我的以下方法需要这样的有界通配符吗? public static Collection requireNonEmpty(final Collection collection) throws NoSuchElementException { if (collection.isEmpty()) { throw new NoSuchElementException(“collection must be non-empty”); } return collection; } 它使用与Objects.requireNonNull(T object)类似的习惯用法,它实际上返回T object 。 […]

原始类型,无界wilcard和有界通配符

我有一个简单的问题如下:这是一个关于这整个问题的简单例子: List a = new ArrayList(); List b; List c; 根据khalid mughal的Java SCJP(一本非常好的书!): a = b; // ok. Widening conversion. b = a; // ok too. No unchecked warning. b = c; // ok c = b; // ok c=a; // ok but now will issue a unchecked warning. // clause 1 我确实理解任何原始类型(例子a)在分配给任何有界威尔卡引用时,未经检查的警告都是问题(因为原始类型中的内容可以是任何东西)。 我的问题是因为c是最高上限(?扩展对象),不应该在没有该警告的情况下分配给c?

在Java中,在generics类型的实例上调用getClass时如何避免原始类型?

假设我在Java中有这个: List list = new ArrayList(); list.getClass(); 最后一个表达式的类型是Class Class 。 我理解为什么,由于擦除,它不能是Class<? extends List> Class<? extends List> 。 但为什么不能成为Class<? extends List> Class<? extends List> ? 如果我想将这个表达式的结果分配给一个变量,以某种方式保存这个类实际上是某种List的信息,我是否有办法避免未经检查的强制转换警告和原始类型警告 ? Class listClass = list.getClass(); // raw type warning Class<? extends List> listClass = (Class<? extends List>) list.getClass(); // unchecked cast warning

下限有界通配符未针对上限有效类型参数进行检查

我想知道为什么这段代码编译成功? 源代码: abstract class A { public abstract A useMe(A k); } 编译成功 它是如何工作的以及为什么编译? M是任何类型,为什么它可以使用? 应该是: ? 这不会编译: abstract class A { public abstract A useMe(A k); } 错误信息: 类型参数M不在类型变量K的范围内,其中M,K是类型变量:M扩展方法useMe中声明的对象(A)K扩展在类A中声明的数字 有什么不同?

是否可以在Java中为数字框类型编写通用的+1方法?

这不是功课。 第1部分 是否可以编写generics方法,如下所示: T plusOne(T num) { return num + 1; // DOESN’T COMPILE! How to fix??? } 如果没有使用一堆instanceof和强制转换,这可能吗? 第2部分 以下3种方法编译: Integer plusOne(Integer num) { return num + 1; } Double plusOne(Double num) { return num + 1; } Long plusOne(Long num) { return num + 1; } 是否可以编写一个将T绑定到只有Integer , Double或Long的generics版本?

为什么只允许在某些地方传递子类到有界通配符?

以下内容来自generics教程: 说R类扩展S, public void addR(List s) { s.add(0, new R()); // Compile-time error! } 您应该能够弄清楚为什么不允许上面的代码。 s.add()的第二个参数的类型是? 扩展S – 一个未知的S子类型。因为我们不知道它是什么类型,我们不知道它是否是R的超类型; 它可能是也可能不是这样的超类型,所以在那里传递R是不安全的。 我已经阅读了几次,但我仍然不太明白为什么以下是一个错误 鉴于List.add()的签名 void add(int index, E element) 不等于 void add(int index, element) // just to explain the idea, not a valid syntax 为什么这是一个错误调用add(0,new R())R是一个S?

Java未绑定的通配符generics

在Bar类中使用通配符类型generics而不是完全跳过它们有什么好处吗? public class Foo {} public interface Bar { public void addFoo(Foo foo); public Foo getFoo(String name); }

嵌套有界通配符

当我尝试编译以下代码时: LinkedList<List> numList = new LinkedList<List>(); 我得到一个不兼容的类型错误: Required: LinkedList <java.util.list> Found: LinkedList <java.util.list> 如何实现一个包含List的元素的LinkedList ,其中包含扩展Number元素? 为了清楚numList ,我希望以下列方式向numList添加列表: numList.add(new LinkedList());

为什么三元运算符不像带有边界通配符的generics类型?

以下类定义了两种方法,两种方法都直观地具有相同的function。 每个函数都使用两个List列表来调用List List和一个布尔值,指定应将哪些列表分配给局部变量。 import java.util.List; class Example { void chooseList1(boolean choice, List list1, List list2) { List list; if (choice) list = list1; else list = list2; } void chooseList2(boolean choice, List list1, List list2) { List list = choice ? list1 : list2; } } 根据javac 1.7.0_45 , chooseList1有效而chooseList2不有效。 它抱怨说: java: incompatible types required: […]

Java在返回类型中绑定了通配符

我已经阅读过各种各样的地方,包括在方法返回类型中使用有界通配符是一个坏主意。 但是,我无法找到一种方法来避免与我的class级。 我错过了什么吗? 情况看起来像这样: class EnglishReaderOfPublications { private final Publication publication; EnglishReaderOfPublications(Publication publication) { this.publication = publication; } void readPublication() { publication.omNomNom(); } Publication getPublication() { return publication; } } 总而言之,我希望能够使用某些变体的英语版本的类。 该类需要允许从外部访问该发布,但理想情况下, getPublication的调用者不希望将结果作为有界通配符。 他们会对Publication感到满意。 这有什么办法吗?