Тип подстановочного знака Java 8 не может быть создан непосредственно - PullRequest
1 голос
/ 20 марта 2019

Java 8 здесь. У меня есть следующий общий класс:

public class Memory<T> {
    private String moniker;
    private Date timestamp;
    private T data;

    // constructors, getters & setters, etc.
}

Я пытаюсь создать неуниверсальный MemoryFactory, например, так:

public class MemoryFactory {
    public Memory<?> createMemory(Object data, String moniker) {
        Date now = new Date();

        return new Memory<?>(moniker, now, data);
    }
}

Однако я получаю ошибку компилятора в операторе возврата для этого <?> использования:

Тип подстановочного знака '?' не может быть создан непосредственно

Итак, еще раз, я хочу, чтобы MemoryFactory не был универсальным, и разрешите мне сделать следующие вызовы:

Memory<Fizz> fizzMemory = memoryFactory.createMemory(new Fizz(), "fizz1");
Memory<String> strMemory = memoryFactory.createMemory("SOMETHING", "str1");
Memory<Buzz> buzzMemory = memoryFactory.createMemory(new Buzz(11, true), "buzz1");

Что мне нужно сделать, чтобы выполнить это и исправить ошибку компилятора?

1 Ответ

3 голосов
/ 20 марта 2019

Эта подпись не позволит вам делать эти вызовы в любом случае, независимо от того, что вы делаете в реализации, потому что Memory<?> является супертипом из Memory<Fizz/Buzz/AnythingElse>.Если бы у вас было public Object createMemory(...), вы бы не ожидали присвоить его результат Memory<Fizz>, не так ли?Это ничем не отличается.

Чтобы разрешить эти вызовы, у вас есть , чтобы сделать createMemory (не MemoryFactory) родовым:

public <T> Memory<T> createMemory(T data, String moniker) {
    Date now = new Date();

    return new Memory<>(moniker, now, data); // or new Memory<T>
}
...