具有'语义'的Java泛型,这可能吗?

Tim*_*Tim 19 java generics

如果我通过选择"语义"这个词来使用错误的术语,那么首先道歉.

出于各种显而易见的原因,我非常喜欢Java中的泛型.当我处理各种各样奇怪的代码时,它对我有很大的帮助,而且我经常要回到旧的东西.今天我发现自己有一个经典的参数错位错误,我可能不会在前通用时代写的 - 它们让我有点懒.

我想知道是否有一种语言特性,无论是用Java还是用其他语言中的类似概念,它都具有泛型的类型安全性并将其扩展到一种语义安全性.具体来说,我想帮助捕获因将正确的东西放在错误的地方而导致的错误.

一个简单的例子:

Map<String, String> myMap = new HashMap<String, String>();
String myKey = "key";
String myVal = "value";
myMap.put(myVal, myKey);
Run Code Online (Sandbox Code Playgroud)

哪个没有编译器会捕获.我想,我可以子类化String包装器给我一个Key类型和Value类型.我可以命名我的变量以表明它们的用途(就像我在这个例子中所做的那样).还有什么?

所以我的问题是:

  • 出于学术兴趣,这个概念叫什么,这个功能有哪些语言?
  • 在没有任何此类语言功能的情况下,避免此类错误的最佳做法是什么?

谢谢

ada*_*ham 6

我总是使用具有两种不同类型的键和值的映射,从不使用相同的类型.我想有时候你想要使用与你的例子中相同的类型作为键和值.我无法想到任何具有此功能的语言.

实际上我之前使用过Clojure,对于地图,它使用一个关键字来表示:key,然后值就是值.它使它更清晰,但现在我正在涉及功能编程,这不是你问的问题.查看类似Lisp的语言.

我认为这只是一个没有让他们混淆的情况,Java当然不能强制执行这种检查.

最好的建议是为键和值使用不同的类型,以便编译器可以检测类型错误,或者像您一样明确地命名键和值变量.