Tag: 类型推断

如何创建Stream ,只有一个元素与Stream.of?

使用Stream.of创建通用流非常方便,但是如果我想创建只有一个元素的Stream呢? 假设我有: String[] tropicalFruits = new String[] {“pineapple”, “banana”, “mango”}; String[] fruits = new String[] {“melon”, “peach”, “apple”}; 然后Stream.of(tropicalFruits, fruits)生成两个元素的Stream 。 如何为单个元素的流实现相同的function? 如果我尝试: Stream fruittyStream = Stream.of(tropicalFruits); 我明白了: 错误:不兼容的类型:推理变量T具有不兼容的边界 等式约束: java.lang.String[] 下界: java.lang.String Stream fruittyStream = Stream.of(fruits); ^—————^ 我用Google搜索并搜索了但是我什么也没得到。 在我看来,这不是一个非常不寻常的或esoeteric问题,所以有点令人惊讶我没有得到任何答案(或者我没有用正确的关键词搜索)。

Eclipse Neon.1generics编译错误:无法推断类型参数

MWE : import java.util.Comparator; import java.util.TreeMap; import static java.util.Arrays.asList; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList; public class ShouldCompileInEclipse { void doesNotCompileInEclipse() { asList(“eclipse”).stream() .collect(groupingBy( this::function, () -> new TreeMap(Comparator.reverseOrder()), mapping(this::function, toList()))); } String function(String s) { return s; } } 为什么代码不能在Eclipse下编译? Version: Neon.1a Release (4.6.1) Build id: 20161007-1200 错误是: Cannot infer type […]

具有不同arities的重载方法的方法引用无效

尝试编译表达式Comparator.comparing(String::toLowerCase) ,Java编译器返回错误。 有关更多信息,请参阅以下问题: 为什么Comparator.comparing不能与String :: toLowerCase方法引用一起使用? 我试图尽可能地减少这个问题。 特别是,我已经删除了几乎所有依赖项到其他类。 main方法包含两个方法调用。 第一个语句编译时没有错误,而第二个语句产生错误。 interface Fun { R apply(T t); } public final class Foo { public static void main(String… args) { invoke(Foo::bar); // OK invoke(Foo::baz); // ERROR } private static void invoke(Fun f) { } private String bar() { return null; } private String baz() { return null; […]

Java 8:通用类型推断改进

使用JEP 101:广义目标类型推断 ,这个 final List bools = Arrays.asList(true,false, true); final List string = bools.stream() .map(x -> x ? ‘X’ : ‘O’) .collect(Collectors.toList()); 应该可以减少到 final List bools = Arrays.asList(true, false, true); final List string = bools.stream() .map(x -> x ? ‘X’ : ‘O’) .collect(Collectors.toList()); 在Java 8中,但后者不编译: Type mismatch: cannot convert from List to List 我弄错了吗? 还是我领先于我的工具? […]

Java中的通用方法和类型推理

鉴于以下不是非常有用的代码: package com.something; import java.util.ArrayList; import java.util.Collection; //Not a generic class! public class Test { public void plain(T param1, T param2) {} public void fancy(T param1, Collection param2) {} public void testMethod() { //No error fancy(“”, new ArrayList()); //Compiler error here! fancy(“”, new ArrayList()); //No error plain(“”, new ArrayList()); } } (如果错了,请纠正我的理解!) 对fancy()的第二次调用是一个编译器错误,因为Java无法推断两个参数之间的任何常见类型(不能推断Object因为第二个参数必须是Collection 。) 对plain()的调用不是编译器错误,因为Java在两个参数之间推断出通用类型的Object […]

目标类型具有通配符时的通用方法类型推断

我知道编译器使用目标类型来确定使generics方法调用适用的类型参数。 例如,在以下声明中: List listOne = Collections.emptyList(); 其中Collections.emptyList在其签名中具有类型参数T public static final List emptyList() { 在这种情况下, T的推断类型参数是String 。 现在考虑以下内容: List listTwo = Collections.emptyList(); 在这种情况下,推断类型是什么? 是Object吗? 或者它并不重要,因为通配符告诉编译器任何类型都是可能的?

为什么这个分支打破类型推断?

我正在使用Java中的Either的本地实现,它具有如下方法: public static Either left(final L value); public static Either right(final R value); public T fold( final Function leftFunction, final Function rightFunction); 这两种方法编译和工作正常: Either rightToLeft() { Either input = Either.right(new Bar()); return input.fold( l -> null, r -> Either.left(new Foo()) ); } Either rightToRight() { Either input = Either.right(new Bar()); return input.fold( l -> null, […]

可以将具有推断类型的局部变量重新分配给其他类型吗?

我记得在某处读过带有推断类型的局部变量可以用相同类型的值重新分配,这是有意义的。 var x = 5; x = 1; // Should compile, no? 但是,我很好奇如果你要将x重新分配给不同类型的对象会发生什么。 这样的东西还会编译吗? var x = 5; x = new Scanner(System.in); // What happens? 我目前无法安装JDK 10的早期版本,并且不想等到明天才发现。

为什么Java的类型推断如此弱?

说,我有一个方法: public static Collection addToCollection(T element, Collection collection) { collection.add(element); return collection; } 然后在尝试编译此代码时: Integer i = 42; Collection result = addToCollection(i, Collections.emptyList()); 我收到错误Type mismatch: cannot convert from Collection to Collection 。 任何人都可以解释为什么类型系统无法推断Collections.emptyList()应该是Collection类型? 上面的例子显然是非常人为的,但我一直偶然发现这个限制,这真的很烦人。 在阅读了Effective Java之后,我发现你可以简单地进行Collections.emptyList() (必须说,那对我来说这是一个很好的启示)并且所有内容都能顺利编译,但是当你有一些复杂的类型时那真是令人讨厌。 我只是想知道这是不是某种错误,还是有任何正当理由让它以这种方式工作?

使用局部类型推断的交叉点类型的有用应用

正如本博客所述 ,我们现在能够使用本地类型推断编写以下内容(据我所知,这是以前在不引入更多代码的情况下不可能的): public static void main(String… args) { var duck = (Quacks & Waddles) Mixin::create; duck.quack(); duck.waddle(); } interface Quacks extends Mixin { default void quack() { System.out.println(“Quack”); } } interface Waddles extends Mixin { default void waddle() { System.out.println(“Waddle”); } } interface Mixin { void __noop__(); static void create() {} } 这个问题可能过于宽泛或主要基于意见,但是当利用这样的交集类型时,是否存在任何有用的应用?