Java Tuple без создания параметров нескольких типов

Есть ли способ создать Tuple в Java, без необходимости создавать несколько классов?

Например, можно создать разные классы для каждого типа кортежей, каждый с разным числом Type Parameters:

public class SingleTuple<T>{}
public class DoubleTuple<T1, T2>{}
public class TripleTuple<T1, T2, T3>{}
public class QuadraTuple<T1, T2, T3, T4>{}
public class PentaTuple<T1, T2, T3, T4, T5>{}

И также возможно создать объект Tuple без каких-либо Type Parameters просто сделав это:

public class Tuple{

    private Object[] objects;

    public Tuple(Object... objects){
        this.objects = objects;
    }

    public Object get(int index){
        return this.objects[index];
    }
}

За исключением случаев, когда это используется, все объекты должны быть приведены к своему правильному подклассу, как только они будут извлечены из кортежа, делая его похожим на ArrayList<Object>, но с меньшими возможностями.

Есть ли способ просто создать один единственный класс, и иметь несколько Type Parameters без определения их всех (как в первом примере), используя что-то вроде этого?

public class Tuple<T...>{

}

3 ответа

Решение

Нету. Если вы хотите обеспечить безопасность типов, вам придется создавать их так, как вы представили в своем первом фрагменте кода. Есть библиотеки, которые делают это для вас, например, jOOL.

Есть отвратительный обходной путь.

Все, что вам нужно, это класс Pair<A, B>, Тогда вместо QuadraTuple<T1, T2, T3, T4> Вы могли бы иметь Pair<T1, Pair<T2, Pair<T3, T4>>>,

Чтобы получить T3 из этого вам придется написать T3 t3 = quadraTuple.second().second().first();, Это типобезопасно и распространяется на любое количество параметров.

Никогда не делай этого.

Я разработал библиотеку на Java, которая реализует небезопасный по типу кортеж ( class), вдохновленный кортежами языка Python. Как и в других ответах, если вы хотите обеспечить безопасность типов в Java, вы должны определить общий тип для каждого элемента кортежа. В качестве альтернативы вы можете проверить ожидаемый тип во время выполнения и поймать своего рода исключение Java. Моя библиотека также предоставляет типизированный кортеж ( class), что позволяет выполнять более строгую проверку типов во время выполнения, чтобы свести к минимуму ошибки программирования, где это необходимо. Чтобы выполнить строгую проверку типов, разработчик должен создать схему ( class) и он должен указать ожидаемый тип при вызове метод связанного экземпляра кортежа.

Приглашаю вас посмотреть мой репозиторий на GitHub: JTuple

Эта реализация кортежа очень полезна для меня, и я постоянно применяю ее во многих других проектах.

Другие вопросы по тегам