Ik wil een Map waarbij de key MyKey<T> en de value MyVal<T> heterogeen zijn in T. De definitie van MyKey en MyVal doen er niet zoveel toe, maar ter illustratie zou ik het volgende kunnen doen:
Echter, dit is niet precies genoeg! Dat de wildcard een willekeurig type representeert, dat is precies wat ik hebben wil, maar ik wil ook vereisen dat de twee willekeurige typen hetzelfde zijn. Het volgende is nu niet mogelijk:
De twee wildcards worden geopend naar twee verschillende type constanten en doSomething vereist dat deze twee typen hetzelfde zijn.
Uiteraard zijn er wel mogelijkheden om om dit probleem heen te werken. Zo kan ik een kopie van de MyKey<T> opslaan in de MyVal<T>, of op de nodige plaatsen wat "unchecked" casts invoegen. Beide oplossingen zijn lelijk.
Ik zou dus eigenlijk iets willen uitdrukken met wat verzonnen syntax:
Is iets dergelijk mogelijk in Java?
Java:
1
2
3
| class MyKey<T> implements Comparable<MyKey<T>> { T obj; /* snip */ } class MyVal<T> { T obj; } Map<MyKey<?>,MyVal<?>> map; |
Echter, dit is niet precies genoeg! Dat de wildcard een willekeurig type representeert, dat is precies wat ik hebben wil, maar ik wil ook vereisen dat de twee willekeurige typen hetzelfde zijn. Het volgende is nu niet mogelijk:
Java:
1
2
3
4
| for (Map.Entry<MyKey<?>,MyVal<?>> e: map.entrySet()) doSomething(e.getKey().obj, e.getVal().obj); <T> void doSomething(T a, T b) { ... } |
De twee wildcards worden geopend naar twee verschillende type constanten en doSomething vereist dat deze twee typen hetzelfde zijn.
Uiteraard zijn er wel mogelijkheden om om dit probleem heen te werken. Zo kan ik een kopie van de MyKey<T> opslaan in de MyVal<T>, of op de nodige plaatsen wat "unchecked" casts invoegen. Beide oplossingen zijn lelijk.
Ik zou dus eigenlijk iets willen uitdrukken met wat verzonnen syntax:
Java:
1
| Map<exists T <MyKey<T>,MyVal<T>>> |
Is iets dergelijk mogelijk in Java?
putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]