Java泛型可以根据表达式的返回类型推断泛型类型参数的类型.考虑以下:
public static <T> T uncheckedCast(Object o) {
return (T)o;
}
Run Code Online (Sandbox Code Playgroud)
我们可以称之为:
Map<Baz,Bog> bazbogMap = new HashMap<Baz,Bog>();
String foo = uncheckedCast(bazbogMap);
Run Code Online (Sandbox Code Playgroud)
这将编译但RuntimeException在调用时抛出一个,因为它会尝试将其转换Map为a String但是失败.但重点是Java <T>根据呼叫站点的预期结果类型推断出值.
我们也可以在Scala中执行以下操作:
def uncheckedCast[T](o: AnyRef): T = o.asInstanceOf[T]
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
Java还可以从嵌套定义中推断出类型参数并返回它们(即我们实际上不必将结果分配给类型,以便在使用它之前使用它; Java知道它已经是什么.)
一个简单的类显示:
import java.util.HashMap;
import java.util.Map;
public class KeysAndValues {
public interface Key<T> {}
public static class StringKey implements Key<String> {}
private final Map<Class<?>, Object> lookup;
public KeysAndValues() {
lookup = new HashMap<Class<?>, Object>();
}
@SuppressWarnings("unchecked")
public <V, K extends Key<V>> …Run Code Online (Sandbox Code Playgroud) 前几天我正在用 C# 编写一些代码来获取对象列表,每个对象包含一个数组字段,并将其转换为映射(即字典),其中对象成为值,并且对象的数组字段的每个元素成为键。这可能没有多大意义,所以让我们展示一些代码。在 Scala 中,我可能会这样做:
// Data class
class MyClass(val keys:Array[String])
object MyClassTests {
// Dummy method just to get some sample data
def getMyClassList() = List(
new MyClass(Array("one", "two", "three")),
new MyClass(Array("four", "five", "six")))
def test() = {
val list = getMyClassList()
val map1 = list.view.flatMap(mc => mc.keys.map(_ -> mc)).toMap
// or, if you like for-comprehensions:
val map2 = (for (mc <- list.view; k <- mc.keys) yield k -> mc).toMap
map1 // or map2, same difference
}
}
Run Code Online (Sandbox Code Playgroud)
在 …
尝试make WordNet 3.0时,它退出时出现错误2.向上滚动,出现以下错误:
In file included from tkAppInit.c:16:
/usr/include/tk.h:78:23: error: X11/Xlib.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我们如何在OS X 10.8上安装WordNet?