2. Java Advanced Tutorial(Generics) Hamid Ghorbani https://ir.linkedin.com/in/ghorbanihamid
Generic sub-typing:
Generics doesn’t support sub-typing, so:
از اسﺘفاده اﻣكانsub-Typing:نﺪارد وجود جﻨريك نوع در
List<Number> numbers = new ArrayList<Integer>(); // compile Error
Bounded Type Parameters:
There may be times when you'll want to restrict the kinds of types that are allowed to be passed to a type parameter.
For example, a method that operates on numbers might only want to accept instances of Number or its subclasses.
This is what bounded type parameters are for.
خواهيﺪ ﻣي شﻤا كﻪ دارد وجود ﻣواقعيتابع بﻪ دارنﺪ اجازه كﻪ را هايي داده نوعGenericكﻨيﺪ ﻣحﺪود شونﺪ ارسالبﻪ بايﺪ نوع پاراﻣﺘر ﺻورت اين در .
بر .نﺪهﺪ برناﻣﻪ بﻪ اجرا اجازه باشﺪ نﺪاشﺘﻪ را نﻈر ﻣورد شروط نﻈر ﻣورد داده نوع اگر فراخواني حين در كﻪ باشﺪ اي گونﻪاعﺪاد روي بر كﻪ تابع يك ،ﻣثال اي
نوع از هايي داده تﻨها بﺨواهﺪ است ﻣﻤكن ،دهﺪ ﻣي انجام عﻤﻠياتNumber.كﻨﺪ قبول را آن فرزنﺪ هاي كﻼس يا واز بايﺪ كار اين برايبا هاي پاراﻣﺘر
شﺪه ﻣحﺪود نوعكﻨيم اسﺘفاده.برا نوع پاراﻣﺘر خود نام ابﺘﺪا بايﺪ كار اين انجام رايكﻠيﺪي كﻠﻤﻪ آن از بعﺪ و بياوريمExtendsكﻼس نام آن از بعﺪ و
كﻠيﺪي كﻠﻤات از توان ﻣي نوع پاراﻣﺘرهاي كردن ﻣحﺪود براي .بياوريم را پﺪرextends , implements.كرد اسﺘفاده
Example:
We know that all wrapper classes(Integer,Long,Double,Boolean .. etc) are Sub Classes of Number class
نوع از اي ﻣجﻤوعﻪ زير عﺪدي انواع هﻤﻪ كﻪ دانيم ﻣيNumber.هسﺘﻨﺪنوع از هايي داده تﻨها بﺨواهيم ايﻨكﻪ برايnumberزير شكل بﻪ بايﺪ بپذيريم را
:كﻨيم عﻤل
class BoundedTest<T extends Number>{
private T num;
public void setNum(T num) {
this.num = num;
}
public T getNum() {
return num;
}
}
public static void main(String args[]) {
BoundedTest <Integer> myVar = new BoundedTest<>(); //Correct
myVar.setNum( Integer.valueOf(10) );
Integer i = myVar.getNum();
BoundedTest<Double> u1 = new BoundedTest<Double>();//Correct
BoundedTest<String> u2 = new BoundedTest<String>();//Compile Error(String is not in bound)
}
Example:
We know that Thread class is implementation class of Runnable interface
class BoundedTest<T extends Runnable>{
}
BoundedTest<Runnable> u1 = new BoundedTest<Runnable>(); //Correct
BoundedTest<Thread> u2 = new BoundedTest<Thread>(); //Correct
BoundedTest<String> u3 = new BoundedTest<String>(); //Compile Time Error(String is not in its bound)
3. Java Advanced Tutorial(Generics) Hamid Ghorbani https://ir.linkedin.com/in/ghorbanihamid
Generic Classes:
A generic class declaration looks like a non-generic class declaration, except that the class name is followed by a
type parameter section.
بين نوع پاراﻣﺘرهاي كﻼس نام از بعﺪ كﻪ است اين آن تفاوت تﻨها .است ﻣعﻤولي كﻼس يك تعريﻒ بﻪ شبيﻪ بسيار جﻨريك كﻼس يك تعريﻒ<>خواهﺪ
.كﻨيم جﺪا (,) كاﻣا اسﺘفاده با را آنها بايﺪ باشيم داشﺘﻪ نوع پاراﻣﺘر يك از بيش اگر .آﻣﺪ
: نكﺘﻪاين برايﻣانﻨﺪ اﺻﻠي هاي داده انواع توانيم نﻤي كﻨيم اسﺘفاده جﻨريك ﻣﺘﺪ يا كﻼس از كﻪintيا وdoubleكﻼس بايﺪ و بﺪهيم آن بﻪ را
wrapperيعﻨي آنهاIntegerوDoubleدهيم ﻣي اخﺘﺼاص جﻨريك كﻼس بﻪ را.
Example:
public class Box<T> {
private T myVar;
public void add(T testVar) {
this.myVar = testVar;
}
public T get() {
return myVar;
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>();
integerBox.add(new Integer(10));
stringBox.add(new String("Hello World"));
System.out.printf("Integer Value :%dnn", integerBox.get());
System.out.printf("String Value :%sn", stringBox.get());
}
}
Example2:
كنيد فﺮضليستهايپيونديكنيم سازي پياده را،ليست ﻫاي گﺮه ﺑﺮاييككﻼسﺑانامNodeتعﺮيفﻫ ،كنيم ﻣيﺮگﺮهدوفيلدﻣهمدارد:
1(ﻣقداركﻪ گﺮهازﻫﺮنوعيﻣيتواندﺑاﺷد.٢(آدرسگﺮهﺑعدي
public class Node <E> {
E item;
Node<E> nextElement;
public void Node(E item, Node<E> nextElement) {
this.item= item;
this. nextElement = nextElement;
}
}
Node<String> last= new Node("Taghi", null);
Node<String> first= new Node("Ali", last);
4. Java Advanced Tutorial(Generics) Hamid Ghorbani https://ir.linkedin.com/in/ghorbanihamid
Generic Classes and Subtyping
We can subtype a generic class or interface by extending or implementing it.
اﻣكانsubtype.دارد وجود جﻨريك كﻼسهاي از گرفﺘن
Example:
ArrayList<E> implements List<E> that extends Collection<E>
So:
ArrayList<String> is a subtype of List<String> and List<String> is subtype of Collection<String>.
Raw Type:
انواعدادهعامرابﺪونپاراﻣﺘر تﺼريحنوعهمﻣيتواناسﺘفاده.گويﻨﺪ خام داده نوع آن بﻪ كﻪ كرددراين،ﺻورتكاﻣپايﻠرِلحﺪاقﻣحﺪوديتﻣﻤكن
رابراياينانواعاعﻤالﻣيكﻨﺪ.
ArrayListlist= new ArrayList();
list.add("A");
list.add(new Integer(5));
list.add(new Character('#'));
Wildcards:
In generic code, the question mark (?), called the wildcard, represents an unknown type. The wildcard can be used
in a variety of situations: as the type of a parameter, field, or local variable; sometimes as a return type.
The wildcard is never used as a type argument for a generic method invocation, a generic class instance creation,
or a supertype.
داده نوع يك عﻨوان بﻪ ؟ عﻼﻣت ،نويسي برناﻣﻪ در عﻤوﻣي حالت دريا ناﻣشﺨصwildcard.شود ﻣي شﻨاخﺘﻪWildcardاز ﻣﺨﺘﻠفي هاي ﻣوقعيت در
ر ﻣي كار بﻪ برگشﺘي ﻣقادير براي داده نوع يك عﻨوان بﻪ هم ﻣواقع بعضي .شود ﻣي اسﺘفاده ﻣحﻠي ﻣﺘغير يك يا ،فيﻠﺪ ،پاراﻣﺘر يك نوع قبيل.ود
.كﻨﺪ ﻣي ايجاد خﻄا كاﻣپايل هﻨگام دسﺘور اين ،بگيريﺪ نﻈر در را زير دسﺘورنوع كﻪ زيراStringنوع ازObjectنيست:
ArrayList<Object> lst = new ArrayList<String>(); // Compilation Error
: داريم نيز زير حالت براي هﻤچﻨين
List<String> strLst = new ArrayList<String>(); // 1
List<Object> objLst = strList; // 2 - Compilation Error
To resolve this problem, a wildcard (?) is provided in generics, which stands for any unknown type.
نوع از ، ﻣشكل اين حل برايwildcardكﻨيم ﻣي اسﺘفادهباشيم داشﺘﻪ ناﻣشﺨص داده نوع بﺘوانيم كﻪ.