Skip to content

Instantly share code, notes, and snippets.

@danieldietrich
Last active November 29, 2016 06:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danieldietrich/02c5e6145ea0c149fc5963313f4bf2cc to your computer and use it in GitHub Desktop.
Save danieldietrich/02c5e6145ea0c149fc5963313f4bf2cc to your computer and use it in GitHub Desktop.
Code of "Why Java Collections Framework is a Cats & Dogs Library"
//
// depends on javaslang-2.1.0.jar
//
import javaslang.collection.*;
import java.util.List;
import java.util.ArrayList;
import static javaslang.API.*;
public class Test {
public static void main(String[] args) {
new Test() {{
immutableShowcase();
mutableShowcase();
}};
}
void immutableShowcase() {
Seq<Dog> dogs = Vector(new Dog());
// Type narrowing, pets = dogs does not compile!
Seq<Pet> pets = Seq.narrow(dogs);
// Vector(Dog, Cat)
println(pets.append(new Cat()));
// Vector(Dog)
println(pets);
// Vector(Dog)
println(dogs);
}
void mutableShowcase() {
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
// Type narrowing, pets = dogs does not compile!
List<Pet> pets = narrow(dogs);
// Heap pollution!
pets.add(new Cat());
// [Dog, Cat]
println(pets);
// Huh!? [Dog, Cat]
println(dogs);
}
@SuppressWarnings("unchecked")
static <T> java.util.List<T> narrow(java.util.List<? extends T> list) {
return (java.util.List<T>) list;
}
}
interface Pet {}
class Cat implements Pet {
@Override public String toString() { return "Cat"; }
}
class Dog implements Pet {
@Override public String toString() { return "Dog"; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment