Java generics для поддержки только предопределенных типов данных

#java #generics

#java #дженерики

Вопрос:

Я хотел бы использовать define универсальный класс в java, который может быть создан только с использованием моих пользовательских типов данных, которые используют один и тот же базовый класс. Возможно ли это сделать без проверки типа данных во время выполнения? Кроме того, я хотел бы запретить создание экземпляра универсального класса без указания типа данных.

Редактировать: я пишу java-оболочку для своей библиотеки c , и поэтому класс java должен разрешать только классы-оболочки для моих типов данных c в качестве параметров. Я просто попытался использовать параметры ограниченного типа, как было предложено, но тогда я все равно могу создать экземпляр такого объекта:

 MyClass c = new MyClass(); 
 

Это в основном код:

 public class MyClass<T extends MyType>
{ 
    public MyClass()
    {

    }

    public doSomething(MyOtherClass<T> other)
    {

    }
}
 

Комментарии:

1. Глядя на ответы ниже, я думаю, что этот вопрос мог бы использовать небольшую проработку или пример.

2. Это не вопрос дженериков, он касается наследования и полиморфизма. Просмотрите эти понятия, а затем посмотрите, как они работают в Java.

3. public <pizza> void myAddition(пицца a, пицца b) { int temp = 0; temp = a b; <Ошибка — ********* System.out.println(«Дополнительное значение равно» temp); } public static void main(строка[] аргументы) { DDHGeneric temp = new DDHGeneric(); temp.myAddition(новое целое число (5), 4); } Есть ли способ с дженериками, чтобы вы могли использовать оператор сложения, даже если вы не знаете тип данных заранее. Потому что в этом дополнении я хочу иметь возможность добавлять целые числа, числа с плавающей запятой, и это выдает ошибку в операторе .

Ответ №1:

То, что вы ищете, называется параметрами ограниченного типа:

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

 public <U extends Number> void inspect(U u){
    System.out.println("T: "   t.getClass().getName());
    System.out.println("U: "   u.getClass().getName());
}
 

Ответ №2:

Из-за стирания типов — и теперь очень старого требования обратной совместимости — невозможно требовать, чтобы класс создавался с параметрами универсального типа. Два решения:

  1. Прислушайтесь к предупреждениям. Пусть разработчики, которые не испытывают гнева исключений во время выполнения 🙂
  2. Разрешать доступ только через классы, которые расширяют общий класс (и предоставляют параметры типа). Например, class MyClassFoo extends MyClass<Foo> а затем скрыть MyClass конструктор от внешнего кода.

Ни то, ни другое не идеально, но это то, что есть. И C , и .NET работают по-разному, но опять же, это C / .NET, а не Java 🙂

Счастливого кодирования.

Ответ №3:

Если вы беспокоитесь о том, что другие создадут свой собственный подкласс вашего базового класса и будут использовать его в вашем общем типе, единственный способ запретить это — контролировать расширение вашего базового класса.

Один из способов — защитить конструктор базового класса, используя видимость по умолчанию, и поместить конкретные реализации в один и тот же класс. Сделайте эти конкретные реализации окончательными или сделайте их конструкторы частными.