Как указать мой тип данных в общих параметрах - PullRequest
0 голосов
/ 14 декабря 2018

Эй, что я хочу сделать, так это сделать с дженериками java. Можно ли указать общий тип класса в моих параметрах?Я не могу описать это очень хорошо, поэтому я попробую на примере у меня следующий класс:

public class List<T>

Можно ли указать мой T, потому что я бы хотел, чтобы это было толькоЦелое число или только логическое значение?

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Вы не можете указать это ограничение непосредственно в универсальном типе класса, как объяснено ernest_k, поскольку эти два возможных типа не имеют общего предка, кроме Object, что означает, наконец, никаких ограничений.
Но вы все равно можете сделатьКласс API вызывает это ограничение.
Сделайте конструктор частным и предоставьте вместо него фабричные методы.

public class Foo<T> {

    private Foo(){}

    public static Foo<Integer> ofInteger(){
        return new Foo<>();
    }

    public static Foo<Boolean> ofBoolean(){
        return new Foo<>();
    }

}

И используйте его, например:

Foo<Boolean> booleanFoo = Foo.ofBoolean();
Foo<Integer> integerFoo = Foo.ofInteger();
0 голосов
/ 14 декабря 2018

Да, вы можете указать значения T чуть более четко.Вы можете использовать: List<Integer> или List<Boolean>, если вы хотите ограничить его одним типом.И вы также можете использовать что-то вроде этого: List<T extends Number>, который будет принимать только целые числа, числа с плавающей запятой, ...

0 голосов
/ 14 декабря 2018

Если у вас нет точного класса, у которого есть подклассы, такие как Boolean и Integer, вы не можете точно определить List следующим образом.

Вы можете определить список как:

List<? super Object> list = new ArrayList<>();

Но в этом случае вы можете поместить туда каждый класс, который расширяет Object, что, конечно, не то, что вам нужно, но может помочь в подобных задачах.

Например:

Когда у вас есть такие классы, как: Animal, Cat, Dog.

Затем вы можете составить список вроде:

List<? super Animal> list = new ArrayList<>();

и добавить к нему каждый класс, который является подклассом от Animal:)

0 голосов
/ 14 декабря 2018

Согласно этому другому вопросу SO, ответ - нет.

Если вы хотите использовать Integer или Boolean, вы не можете использовать подход, определенный в этом предыдущем ответелибо, поскольку, насколько мне известно, не существует класса, который является общим только для типов данных Integer и Boolean.

В вашем случае проще создатьпереопределения, которые принимают Integer или Boolean параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...