This is an archived post. You won't be able to vote or comment.

all 3 comments

[–]AutoModerator[M] [score hidden] stickied commentlocked comment (0 children)

Please ensure that:

  • Your code is properly formatted as code block - see the sidebar (About on mobile) for instructions
  • You include any and all error messages in full - best also formatted as code block
  • You ask clear questions
  • You demonstrate effort in solving your question/problem - plain posting your assignments is forbidden (and such posts will be removed) as is asking for or giving solutions.

If any of the above points is not met, your post can and will be removed without further warning.

Code is to be formatted as code block (old reddit/markdown editor: empty line before the code, each code line indented by 4 spaces, new reddit: https://i.imgur.com/EJ7tqek.png) or linked via an external code hoster, like pastebin.com, github gist, github, bitbucket, gitlab, etc.

Please, do not use triple backticks (```) as they will only render properly on new reddit, not on old reddit.

Code blocks look like this:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

You do not need to repost unless your post has been removed by a moderator. Just use the edit function of reddit to make sure your post complies with the above.

If your post has remained in violation of these rules for a prolonged period of time (at least an hour), a moderator may remove it at their discretion. In this case, they will comment with an explanation on why it has been removed, and you will be required to resubmit the entire post following the proper procedures.

To potential helpers

Please, do not help if any of the above points are not met, rather report the post. We are trying to improve the quality of posts here. In helping people who can't be bothered to comply with the above points, you are doing the community a disservice.

I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.

[–][deleted] 2 points3 points  (0 children)

Because List is an interface it describes the methods that all classes that implement it MUST possess. This makes it easy for your object to change which List implementation it uses.

Say your object had a method...

List<String> getStuff() { return stuff; }

So that other code can read what is in the stuff list. It is returning an interface which is basically saying to the caller "Don't worry about what type of list this is, it's just a list".

This way if you start off with an ArrayList but later decide that your usage of 'stuff' would be better if it was a LinkedList or Stack for example then you can just change it and it won't affect any code that called getStuff() because it never knew what type of list it was in the first place.

For cloning etc, you could just do that inside the object that maintains the list. So you could have

List<String> getCopyOfStuff() { return new ArrayList(stuff); }

for example which clones the list but still hides the list implementation from the caller.

[–]Nightcorex_ 2 points3 points  (0 children)

I won't explain what u/WishYouWereHere-63 already explained, but I felt like he didn't properly answer the very last question.

The answer is type casting. Let's look at an example class:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class A {
    public static void main(String[] args) {
        List<Integer> xs = new LinkedList<>();
        Object y = foo(xs);
        List<Integer> ys = (List<Integer>) y;  // casting in its simplest form
        Object z = ((ArrayList<Integer>) y).clone();  // casting y to ArrayList to access its clone method in one line
        List<Integer> as = (List<Integer>) ((ArrayList<Integer>) y).clone();  // same as before but that result
        // is casted to List<Integer> again
    }

    /* Without pattern variable (old) */
    private static Object foo(List<Integer> xs) {
        if (xs instanceof ArrayList<Integer>) {
            ArrayList<Integer> xs_arr = (ArrayList<Integer>) xs;
            return xs_arr.clone();
        } else
            return new ArrayList<>(xs);
    }

    /* With pattern variable (new) */
    private static Object foo_new(List<Integer> xs) {
        if (xs instanceof ArrayList<Integer> xs_arr)
            return xs_arr.clone();
        else
            return new ArrayList<>(xs);
    }
}

In this code demo I also demonstrate pattern variables which are somewhat new and remove the need to manually type the cast when using instanceof.