Tag: 协方差

为什么A-> B不会使List – > List ? 这不会消除对通配符的需求吗?

免责声明:我不是专业开发人员,我不打算成为一名开发人员。 关于Java的阅读书,因为我想尝试Android编程,没有任何以前的Java经验。 我正在读这本书 – 我更喜欢它。 我已经阅读了关于generics类的章节的一部分,到了他们提到通配符的地步,并且感到困惑。 如果B延伸A: List 不是 List的子类型(据我所知,它们完全相同) List List是List的子类型List List 后者允许编写接受generics类型参数的函数 – 例如List List 。 这样的函数会接受List或List 。 现在,对于我的问题: 以类似于C ++(以“模板”风格)的方式实现generics不是更简单吗? 这将使List和List两种不同的类型,这些类型将以预期的方式相关。 这也可以简单地在函数中声明你期望参数是List类型,这将允许List适合那里。 我猜测不仅仅是“我们讨厌C ++,让我们做出与众不同”这一点:)我很可能还不知道什么,这使得通配符成为一个非常有用的工具。 你对此有何看法? 编辑:如果您在答案中提到List ,请记住使用反引号,以避免被解释为HTML标记。

List <List >是Collection <Collection >的实例吗?

我编写了这个方便的通用函数,用于将集合集合转换为单个集合: public static Set makeSet(Collection<Collection> a_collection) { Iterator<Collection> it = a_collection.iterator(); Set result = new HashSet(); while (it.hasNext()) { result.addAll(it.next()); } return result; } 然后我试着打电话给它: List<List> resultLists = … ; Set labelsSet = CollectionsHelper.makeSet(resultLists); 我收到以下错误: makeSet(java.util.Collection<java.util.Collection>) in CollectionsHelper cannot be applied to (java.util.List<java.util.List>) 现在List 是一个 Collection , String 是 T 那么为什么这不起作用,我该如何解决呢?

为什么Java中的void不协变?

如果我有这个界面: public interface Foo { void bar(); } 为什么我不能这样实现呢? public class FooImpl implements Foo { @Override public Object bar() { return new Object(); } } 似乎无效应该与一切协变。 我错过了什么吗? 编辑:我应该更清楚我正在寻找设计理由,而不是它不会编译的技术原因。 对所有事物进行空洞协变是否会产生负面影响?

如何使用generics从Java中的List 转换为List ?

在Java中,如何使用通用方法将List转换为List以便我可以使用单个方法调用替换以下模式: List untypedList = new ArrayList(); // or returned from a legacy method List typedList = new ArrayList(); for (Object item: untypedList) typedList.add((Integer)item); 请注意,上面的代码不会生成任何类型安全警告,理想情况下,您的解决方案也不应生成任何此类警告。 如果列表Class具有公共默认构造函数,以下解决方案是否可行? public class ListUtil { public static <T, L extends List> L typedList(List untypedList, Class itemClass, Class listClass) { L list = null; try { list = listClass.newInstance(); } catch (InstantiationException […]

java从List 转换为List ,其中B扩展A

这可能吗? 如果没有,为什么这不可能在Java? interface B extends A {} public List getList(); List = getList(); // Type mismatch: cannot convert from List to List 我认为我正在寻找的主题是“协变类型”,就像这里和这里一样 ,但是它很模糊,并没有解决我的问题。

方法返回原语的协方差。 它有效吗?

**自java 5; 我知道如果在基类中我写: public Number doSomething(){ … } 在孩子class上我可以写这样的东西 @Override public Integer doSomething(){ … } 但我有一个问题。 如果在基类方法中返回 – primitive – array – 或Collection。 在这种情况下如何使用协变?

在Stream.reduce()这样的API中选择不变性有什么好理由?

回顾Java 8 Stream API设计,我对Stream.reduce()参数的generics不变性感到惊讶: U reduce(U identity, BiFunction accumulator, BinaryOperator combiner) 相同API的看似更通用的版本可能对U单个引用应用了协方差/逆变,例如: U reduce(U identity, BiFunction accumulator, BiFunction combiner) 这将允许以下目前无法实现的目标: // Assuming we want to reuse these tools all over the place: BiFunction numberAdder = (t, u) -> t.doubleValue() + u.doubleValue(); // This currently doesn’t work, but would work with the suggestion Stream stream = […]

编程语言中的协方差和逆变

谁能解释我,编程语言理论中协方差和逆变的概念?

为什么Java中的逆变参数类型不允许覆盖?

覆盖超类的方法时,Java允许返回类型是协变的。 为什么在重写方法时不允许使用逆变参数类型?

Java协方差

我正在努力解决这个问题。 说我有以下代码: class Animal { } class Mammal extends Animal { } class Giraffe extends Mammal { } … public static List getMammals() { return …; } … public static void main(String[] args) { List mammals = getMammals(); // compilation error } 为什么赋值会导致编译错误? 错误是这样的: Type mismatch: cannot convert from List to List 根据我对协方差的理解, getMammals()方法返回一个总是包含Mammal对象的list ,因此它应该是可赋值的。 […]