Перейти к содержимому

Как параметризовать статический метод java

  • автор:

How to write parametrized Generic class and method in Java Example

How to write parametrized class and method in Java - Example tutorial In this Generic tutorial, we will write a parameterized class called Wrapper which can contain any type specified while creating an instance just like any collection e.g. Hashtable in Java.

Guideline of writing parameterized Generic class

* parameterized class to highlight issues with non-generic classes in Java.
*
* @author Javin Paul
*/
public class GenericTest <

public static void main ( String args []) <

//string wrapper
Wrapper < String > stringWrapper = new Wrapper < String > () ;
stringWrapper. setItem ( «Test» ) ;
System. out . println ( stringWrapper. getItem ()) ;

//compilation error, type checking at compile time
//stringWrapper.setItem(new StringBuffer(«»));

Wrapper < Integer > integerWrapper = new Wrapper < Integer > () ;
integerWrapper. setItem ( 123 ) ;

//compilation error, type safety checking
//integerWrapper.setItem(«123»);
System. out . println ( integerWrapper. getItem ()) ;

// Now let’s see how to write generic wrapper without using
// JDK1.5 generic and what problem it poses

OldWrapper oldStringWrapper = new OldWrapper () ;

//no compilation error i.e. no type checking at compile time
oldStringWrapper. setItem ( 123 ) ;

//will throw ClassCastException at runtime
(( String ) oldStringWrapper. getItem ()) . toUpperCase () ;
>
>

/*
* wrapper can wrap any item
* Generic parameterized form of Wrapper, offers compile time type checking
*/

class Wrapper < T > <
private T item ;

public T getItem () <
return item ;
>

public void setItem ( T item ) <
this . item = item ;
>
>

/*
* Object form of Wrapper fragile and error prone
*/

class OldWrapper <
private Object item ;

public Object getItem () <
return item ;
>

public void setItem ( Object item ) <
this . item = item ;
>
>

How to write parameterized method in Java Generics:

/**
* Java program to demonstrate how to write parameterized method in Java
* parameterized method needs a type parameter declaration before return
* type, here is a type parameter
* @author Javin
*/
class ItemUtils <

public static < T > T wrap ( T item ) <
//code for wrapping item
return item ;
>

Как параметризировать статический метод java

Аватар пользователя Иван Полежаев

Вы можете параметризовать статический метод передавая ему в качестве аргумента обобщенный тип. Например, рассмотрим следующий пример статического метода, который суммирует два числа:

Вы можете параметризовать этот метод, передав ему в качестве аргументов два объекта типа T , где T — это обобщенный тип, как показано в следующем примере:

В этом примере мы использовали обобщенный тип <T extends Number> для параметризации метода sum() . Здесь мы ограничиваем тип T , чтобы он был типом Number или его подклассом, и таким образом мы можем использовать метод doubleValue() для преобразования значения объектов типа T в тип double

Таким образом, мы можем вызвать параметризованный статический метод sum() следующим образом:

Static parameterized methods in Java

I thought I understood generics. However, in this example, I cannot figure out why line isIn1(new Class2(1), arr); is compiled and line isIn2(new Class2(1), arr); is not compiled.

clipper1995's user avatar

2 Answers 2

prints "Not is in" because Class2.equals returns false when this and o are not instances of the exact same class:

arr contains an instance of Class1 , but you passed an instance of Class2 as the first parameter to isIn1 .

Does not compile because there is no types that satisfy the constraints you specified in isIn2 that can be inferred. Specifically, there has to be a type T that is a subtype of Comparable<T> and a type V that is a subtype of T . Class2 would also have to be compatible with T , and Class1[] would have to be compatible with V[] .

"How about T is Class2 and V is Class1 ?" you might say:

That doesn’t work because Class1 is not a subtype of Class2 . They are unrelated at all! The similar isIn1 call fails for the same reason.

By not specifying the generic type parameters, the compiler can try its best to infer the types so that the code compiles. Also note that isIn1 has one fewer constraint than isIn2 .

Here, one solution is T is Comparable<? extends Comparable<?>> , and V is Class1 .

You can check that they satisfy the constraints by using the sub typing rules described in Section 4.10 of the JLS.

Статические методы и поля. Модификатор native. Модификатор synchronized. Логические блоки.

Поля данных, объявленные в классе как static, являются общими для всех объектов класса и называются переменными класса. Если один объект изменит значение такого поля, то это изменение увидят все объекты.

Вызов статического метода также следует осуществлять с помощью указания: ClassName.methodName().

Приложение на языке Java может вызывать методы, написанные на языке С++. Такие методы объявляются с ключевым словом native, которое сообщает компи- лятору, что метод реализован в другом месте. Например: public native int loadCripto(int num); Методы, помеченные native, можно переопределять обычными методами в подклассах.

При использовании нескольких потоков управления в одном приложении необходимо синхронизировать методы, обращающиеся к общим данным. Когда интерпретатор обнаруживает synchronized, он включает код, блокирующий доступ к данным при запуске потока и снимающий блок при его завершении. Вызов методов уведомления о возвращении блокировки объекта notifyAll(), notify() и метода остановки потока wait() класса Object (суперкласса для всех классов языка Java) предполагает использование модифи- катора synchronized, так как эти методы предназначены для работы с пото- ками.

При описании класса могут быть использованы логические блоки. Логиче- ским блоком называется код, заключенный в фигурные скобки и не принадлежа- щий ни одному методу текущего класса, например: < /* код */ >static < /* код */ >При создании объекта класса они вызываются последовательно, в порядке разме- щения, вместе с инициализацией полей как простая последовательность операто- ров, и только после выполнения последнего блока будет вызван конструктор класса. Операции с полями класса внутри логического блока до явного объявле- ния этого поля возможны только при использовании ссылки this, представляю- щую собой ссылку на текущий объект.

Параметризованные классы. Параметризованные методы. Методы с переменным числом параметров.

К наиболее важным новшествам версии языка J2SE 5 можно отнести появле- ние параметризованных (generic) классов и методов, позволяющих использовать более гибкую и в то же время достаточно строгую типизацию, что особенно важ- но при работе с коллекциями. Параметризация позволяет создавать классы, интерфейсы и методы, в которых тип обрабатывае- мых данных задается как параметр.

Объявление generic-типа в виде <T>, несмотря на возможность использо- вать любой тип в качестве параметра, ограничивает область применения разра- батываемого класса. Переменные такого типа могут вызывать только методы класса Object. Доступ к другим методам ограничивает компилятор, предупре- ждая возможные варианты возникновения ошибок. Чтобы расширить возможности параметризованных членов класса, можно ввести ограничения на используемые типы при помощи следующего объявления класса: public class OptionalExt <T extends Tип> < private T value; >Такая запись говорит о том, что в качестве типа Т разрешено применять толь- ко классы, являющиеся наследниками (суперклассами) класса Tип, и соответ- ственно появляется возможность вызова методов ограничивающих (bound) типов.

Параметризованный (generic) метод определяет базовый набор операций, ко- торые будут применяться к разным типам данных, получаемых методом в каче- стве параметра, и может быть записан, например, в виде: <T extends Тип> returnType methodName(T arg) <> <T> returnType methodName(T arg) <> Описание типа должно находиться перед возвращаемым типом. Запись пер- вого вида означает, что в метод можно передавать объекты, типы которых явля- ются подклассами класса, указанного после extends. Второй способ объявления метода никаких ограничений на передаваемый тип не ставит. Generic-методы могут находиться как в параметризованных классах, так и в обычных. Параметр метода может не иметь никакого отношения к параметру сво- его класса.

Возможность передачи в метод нефиксированного числа параметров позволя- ет отказаться от предварительного создания массива объектов для его последую- щей передачи в метод.

public class DemoVarargs <

public static int getArgCount(Integer. args)

if (args.length == 0) System.out.print(«No arg arg:» + i + » «);

public static void main(String args[])

System.out.println(«N N 7″>

Типобезопасные перечисления (typesafe enums) в Java представляют собой классы и являются подклассами абстрактного класса java.lang.Enum. При этом объекты перечисления инициализируются прямым объявлением без помощи оператора new. При инициализации хотя бы одного перечисления происходит инициализация всех без исключения оставшихся элементов данного перечисления.

Перечисление как подкласс класса Enum может содержать поля, конструкто- ры и методы, реализовывать интерфейсы. Каждый тип enum может использо- вать методы: static enumType[] values() – возвращает массив, содержащий все элементы перечисления в порядке их объявления; static T valueOf(Class<T> enumType, String arg) – возвра- щает элемент перечисления, соответствующий передаваемому типу и значению передаваемой строки; static enumType valueOf(String arg) – возвращает элемент пере- числения, соответствующий значению передаваемой строки; int ordinal() – возвращает позицию элемента перечисления.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *