Java - переменная типа для вложенного параметризуемого типа на интерфейсе - PullRequest
0 голосов
/ 19 октября 2018

У меня есть следующий интерфейс:

public interface Box<T> {
    T get();
}

Я хотел бы иметь возможность определить другой интерфейс с параметром Box<SomeType>, но чтобы этот интерфейс "знал", что такое SomeTypeis.

например, я хотел бы определить следующий интерфейс

// this doesn't compile
public interface BiggerBox<B extends Box<H>> {
    H get();
}

Идея в том, что вы могли бы сделать что-то вроде этого:

BiggerBox<Box<String>> biggerBox = new SomeBiggerBox(new SomeBox("some string"));
String value = biggerBox.get();

Ближайшая вещь, которую яможно получить:

public interface BiggerBox<B extends Box> {
    <U> U get();
}

Но это не обеспечивает безопасность типов во время компиляции.

Я думаю, что это невозможно в Java, но я хотел бы знать, так ли это вообще(даже с помощью безумных хаков).

Редактировать: я не хочу добавлять параметр второго типа в интерфейс, т.е. нет BiggerBox<Box<String>, String> (поэтому я считаю, что это невозможно)

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Нет ничего в методах BiggerBox, которые используют «B», поэтому нет никаких причин иметь это в общей сигнатуре.В BiggerBox также нет ничего, что вынуждает «get» поступать из экземпляра Box, и нет ничего, чтобы заставить конструктор брать экземпляр Box.

Это означает, что BiggerBox должен просто делегировать «get» экземпляру Box..

Вот абстрактный класс для этого:

// Could also choose not to have it implement Box interface
public abstract class BiggerBox<T> implements Box<T> {

    private Box<T> box;

    public BiggerBox(Box<T> box) {
        this.box = box;
    }

    public T get() {
        return box.get();
    }
}

Или как интерфейс:

// Could also choose not to have it extend Box interface
public interface BiggerBox<T> extends Box<T> {

    Box<T> getBox();

    default T get() {
        return getBox().get();
    }
}
0 голосов
/ 19 октября 2018

Вы должны добавить это как параметр второго типа:

public interface BiggerBox<B extends Box<H>, H> {
    H get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...