#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:
Из-за стирания типов — и теперь очень старого требования обратной совместимости — невозможно требовать, чтобы класс создавался с параметрами универсального типа. Два решения:
- Прислушайтесь к предупреждениям. Пусть разработчики, которые не испытывают гнева исключений во время выполнения 🙂
- Разрешать доступ только через классы, которые расширяют общий класс (и предоставляют параметры типа). Например,
class MyClassFoo extends MyClass<Foo>
а затем скрытьMyClass
конструктор от внешнего кода.
Ни то, ни другое не идеально, но это то, что есть. И C , и .NET работают по-разному, но опять же, это C / .NET, а не Java 🙂
Счастливого кодирования.
Ответ №3:
Если вы беспокоитесь о том, что другие создадут свой собственный подкласс вашего базового класса и будут использовать его в вашем общем типе, единственный способ запретить это — контролировать расширение вашего базового класса.
Один из способов — защитить конструктор базового класса, используя видимость по умолчанию, и поместить конкретные реализации в один и тот же класс. Сделайте эти конкретные реализации окончательными или сделайте их конструкторы частными.