Содержание
- 2. Обобщения - это параметризованные типы. Параметризованные типы важны, поскольку позволяют объявлять классы, интерфейсы и методы, где
- 3. class Gen { T ob; // declare an object of type T // Pass the constructor
- 4. Обобщения работают только с объектами Gen strOb =new Gen (53) ; // Ошибка, нельзя использовать //
- 5. Обобщенный класс с двумя параметрами типа // A simple generic class with two type // parameters:
- 6. Общая форма обобщенного класса синтаксис объявления обобщённого класса: class имя класса { // ... Ниже показан
- 7. Ограниченные типы В предыдущих примерах параметры типов могли быть заменены любыми типами классов. Это подходит ко
- 8. class Stats { T[] nums; // array of Number or subclass // Pass the constructor a
- 9. Использование шаблонных aргументов Integer inums[] ={ 1, 2, 3, 4, 5 }; Double dnums[] = {
- 10. !! Это не сработает! // Определение эквивалентности двух средних значений. bооlеаn sameAvg(Stats оb) { if (average
- 11. //Определение эквивалентности двух средних значений. // Отметим использования шаблонного символа. // Определение эквивалентности двух средних значений.
- 12. Аргумент-шаблон специфицируется символом ? и представляет собой неизвестный тип. Применение шаблона единственный способ написать работающий метод
- 13. Ограниченные шаблоны Аргументы шаблоны могут быть ограничены почти таким же способом, как параметры типов. Ограниченный шаблон
- 14. / Bounded Wildcard arguments. // Two-dimensional coordinates. class TwoD { int x, y; TwoD(int a, int
- 15. В общем случае, для тoгo, чтобы установить верхнюю границу шаблона, используйте следующий тип шаблонного выражения: здесь
- 16. Создание обобщенного метода // Демонстрация простого обобщенного метода. class GenMethDemo { // Определение, содержится ли объект
- 17. Создание обобщенного метода // Demonstrate a simple generic method. class GenMethDemo { // Determine if an
- 18. Обобщенные конструкторы Конструкторы также могут быть обобщенными, даже если их классы таковыми не являются. // Use
- 19. Обобщенные интерфейсы В дополнение к обобщенным классам и методам вы можете объявлять обобщенные интерфейсы. Обобщенные интерфейсы
- 20. Иерархии обобщенных классов Обобщенные классы могут быть частью иерархии классов так же, как и любые другие
- 21. Использование обобщенноrо суперкласса // A simple generic class hierarchy. class Gen { T ob; Gen(T o)
- 22. class Gen { T ob; Gen(T o) { ob = o; } // Return ob. T
- 23. Обобщенный подкласс Абсолютно приемлемо, когда суперклассом для обобщенногo класса выступает класс необобщенный. Нельзя создавать экземпляр типа
- 24. Ограничения на статические члены Никакой stаtiс член не может использовать тип параметра, объявленный в eгo классе.
- 25. Ограничения обобщенных массивов // Обобщения и массивы. class Gen { т оb; т vals[]; // ОК
- 27. Скачать презентацию
Обобщения - это параметризованные типы.
Параметризованные типы важны, поскольку позволяют объявлять
Обобщения - это параметризованные типы.
Параметризованные типы важны, поскольку позволяют объявлять
class Gen {
T ob; // declare an object of
class Gen
T ob; // declare an object of
// Pass the constructor a reference to
// an object of type T.
Gen(T o) {
ob = o;
}
// Return ob.
T getob() {
return ob;
}
// Show type of T.
void showType() {
System.out.println("Type of T is " +
ob.getClass().getName());
}
}
// Demonstrate the generic class.
class GenDemo {
public static void main(String args[]) {
// Create a Gen reference for Integers.
Gen
// Create a Gen
// reference to iOb. Notice the use of autoboxing
// to encapsulate the value 88 within an Integer object.
iOb = new Gen
// Show the type of data used by iOb.
iOb.showType();
// Get the value in iOb. Notice that
// no cast is needed.
int v = iOb.getob();
System.out.println("value: " + v);
System.out.println();
// Create a Gen object for Strings.
Gen
// Show the type of data used by strOb.
strOb.showType();
// Get the value of strOb. Again, notice
// that no cast is needed.
String str = strOb.getob();
System.out.println("value: " + str);
}
}
Здесь Т имя типa-пapaмeтpa.
Обобщения работают только с объектами
Gen strOb =new Gen (53) ;
Обобщения работают только с объектами
Gen
// примитивные типы
Обобщенные типы отличаются
в зависимости от типов-аргументов
iOb =strOb; // Не верно!
Несмотря на то, что iOb и strOb имеют тип Gen
разные типы, потому что типы их параметров отличаются.
Обобщенный класс с двумя параметрами типа
// A simple generic class
Обобщенный класс с двумя параметрами типа
// A simple generic class
// parameters: T and V.
class TwoGen
T ob1;
V ob2;
// Pass the constructor a reference to
// an object of type T.
TwoGen(T o1, V o2) {
ob1 = o1;
ob2 = o2;
}
// Show types of T and V.
void showTypes() {
System.out.println("Type of T is " +
ob1.getClass().getName());
System.out.println("Type of V is " +
ob2.getClass().getName());
}
T getob1() {
return ob1;
}
V getob2() {
return ob2;
}
}
/ Demonstrate TwoGen.
class SimpGen {
public static void main(String args[]) {
TwoGen
new TwoGen
// Show the types.
tgObj.showTypes();
// Obtain and show values.
int v = tgObj.getob1();
System.out.println("value: " + v);
String str = tgObj.getob2();
System.out.println("value: " + str);
}
}
Результат работы этой программы:
Тип Т: j ava .lang. Integer
Тип V: java.lang.String
Значение: 88
Значение: Обобщения
Общая форма обобщенного класса
синтаксис объявления обобщённого класса:
class имя класса<список
Общая форма обобщенного класса
синтаксис объявления обобщённого класса:
class имя класса<список
Ниже показан синтаксис объявления ссылки на обобщенный класс:
имя класса<список аргументов типов> имя переменной =
new имя класса <список аргументов типов>(список аргументов констант);
Ограниченные типы
В предыдущих примерах параметры типов могли быть заменены любыми
Ограниченные типы
В предыдущих примерах параметры типов могли быть заменены любыми
Чтобы справиться с этой ситуацией, java предлагает ограниченные типы. Когда указывается параметр типа, вы можете создать ограничение сверху, которое объявляет суперкласс, от которого все типы аргументы должны быть унаследованы.
class Gen <Т extends superclass>
class Gen
class Stats {
T[] nums; // array of
class Stats
T[] nums; // array of
// Pass the constructor a reference to
// an array of type Number or subclass.
Stats(T[] o) {
nums = o;
}
// Return type double in all cases.
double average() {
double sum = 0.0;
for(int i=0; i < nums.length; i++)
sum += nums[i].doubleValue();
return sum / nums.length;
}
}
// Demonstrate Stats.
class BoundsDemo {
public static void main(String args[]) {
Integer inums[] = { 1, 2, 3, 4, 5 };
Stats
double v = iob.average();
System.out.println("iob average is " + v);
Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
Stats
double w = dob.average();
System.out.println("dob average is " + w);
// This won't compile because String is not a
// subclass of Number.
// String strs[] = { "1", "2", "3", "4", "5" };
// Stats
// double x = strob.average();
// System.out.println("strob average is " + v);
}
}
class Gen
Здесь Т оrраничено классом по имени MyC1ass и интерфейсом Mylnteface. То есть любой тип, переданный в Т, должен быть подклассом MyClass и иметь реализацию Mylnteface.
Использование шаблонных aргументов
Integer inums[] ={ 1, 2, 3, 4, 5
Использование шаблонных aргументов
Integer inums[] ={ 1, 2, 3, 4, 5
Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
Stats
Stats
if(iob.sameAvg(dob))
Sуstеm.оut.рrinln("Средние значения одинаковы.");
else
Sуstеm.оut.рrintln("Средние значения отличаются.");
Так как Stats параметризованный тип, какой тип параметра вы укажете для Stats, коrда соз
дадите параметр типа Stats?
!! Это не сработает!
// Определение эквивалентности двух средних значений.
bооlеаn sameAvg(Stats
!! Это не сработает!
// Определение эквивалентности двух средних значений.
bооlеаn sameAvg(Stats
if (average () ==ob.average())
return true;
}
//Определение эквивалентности двух средних значений.
// Отметим использования шаблонного символа.
//
//Определение эквивалентности двух средних значений.
// Отметим использования шаблонного символа.
//
bооlеаn sameAvg(Stats> оb) {
if (average () ==ob.average())
return true;
}
Аргумент-шаблон специфицируется символом ? и представляет собой неизвестный тип. Применение шаблона
Аргумент-шаблон специфицируется символом ? и представляет собой неизвестный тип. Применение шаблона
// Use a wildcard.
class Stats
T[] nums; // array of Number or subclass
// Pass the constructor a reference to
// an array of type Number or subclass.
Stats(T[] o) {
nums = o;
}
// Return type double in all cases.
double average() {
double sum = 0.0;
for(int i=0; i < nums.length; i++)
sum += nums[i].doubleValue();
return sum / nums.length;
}
// Determine if two averages are the same.
// Notice the use of the wildcard.
boolean sameAvg(Stats> ob) {
if(average() == ob.average())
return true;
return false;
}
}
// Demonstrate wildcard.
class WildcardDemo {
public static void main(String args[]) {
Integer inums[] = { 1, 2, 3, 4, 5 };
Stats
double v = iob.average();
System.out.println("iob average is " + v);
Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
Stats
double w = dob.average();
System.out.println("dob average is " + w);
Float fnums[] = { 1.0F, 2.0F, 3.0F, 4.0F, 5.0F };
Stats
double x = fob.average();
System.out.println("fob average is " + x);
// See which arrays have same average.
System.out.print("Averages of iob and dob ");
if(iob.sameAvg(dob))
System.out.println("are the same.");
else
System.out.println("differ.");
System.out.print("Averages of iob and fob ");
if(iob.sameAvg(fob))
System.out.println("are the same.");
else
System.out.println("differ.");
}
}
Ограниченные шаблоны
Аргументы шаблоны могут быть ограничены почти таким же способом,
Ограниченные шаблоны
Аргументы шаблоны могут быть ограничены почти таким же способом,
/ Bounded Wildcard arguments.
// Two-dimensional coordinates.
class TwoD {
/ Bounded Wildcard arguments.
// Two-dimensional coordinates.
class TwoD {
TwoD(int a, int b) {
x = a;
y = b;
}
}
// Three-dimensional coordinates.
class ThreeD extends TwoD {
int z;
ThreeD(int a, int b, int c) {
super(a, b);
z = c;
}
}
// Four-dimensional coordinates.
class FourD extends ThreeD {
int t;
FourD(int a, int b, int c, int d) {
super(a, b, c);
t = d;
}
}
// This class holds an array of coordinate objects.
class Coords
T[] coords;
Coords(T[] o) { coords = o; }
}
// Demonstrate a bounded wildcard.
class BoundedWildcard {
static void showXY(Coords> c) {
System.out.println("X Y Coordinates:");
for(int i=0; i < c.coords.length; i++)
System.out.println(c.coords[i].x + " " +
c.coords[i].y);
System.out.println();
}
static void showXYZ(Coords extends ThreeD> c) {
System.out.println("X Y Z Coordinates:");
for(int i=0; i < c.coords.length; i++)
System.out.println(c.coords[i].x + " " +
c.coords[i].y + " " +
c.coords[i].z);
System.out.println();
}
static void showAll(Coords extends FourD> c) {
System.out.println("X Y Z T Coordinates:");
for(int i=0; i < c.coords.length; i++)
System.out.println(c.coords[i].x + " " +
c.coords[i].y + " " +
c.coords[i].z + " " +
c.coords[i].t);
System.out.println();
}
public static void main(String args[]) {
TwoD td[] = {
new TwoD(0, 0),
new TwoD(7, 9),
new TwoD(18, 4),
new TwoD(-1, -23)
};
Coords
System.out.println("Contents of tdlocs.");
showXY(tdlocs); // OK, is a TwoD
// showXYZ(tdlocs); // Error, not a ThreeD
// showAll(tdlocs); // Error, not a FourD
// Now, create some FourD objects.
FourD fd[] = {
new FourD(1, 2, 3, 4),
new FourD(6, 8, 14, 8),
new FourD(22, 9, 4, 9),
new FourD(3, -2, -23, 17)
};
Coords
System.out.println("Contents of fdlocs.");
// These are all OK.
showXY(fdlocs);
showXYZ(fdlocs);
showAll(fdlocs);
}
}
// Demonstrate a bounded wildcard.
class BoundedWildcard {
static void showXY(Coords> c) {
System.out.println("X Y Coordinates:");
for(int i=0; i < c.coords.length; i++)
System.out.println(c.coords[i].x + " " +
c.coords[i].y);
System.out.println();
}
static void showXYZ(Coords extends ThreeD> c) {
System.out.println("X Y Z Coordinates:");
for(int i=0; i < c.coords.length; i++)
System.out.println(c.coords[i].x + " " +
c.coords[i].y + " " +
c.coords[i].z);
System.out.println();
}
static void showAll(Coords extends FourD> c) {
System.out.println("X Y Z T Coordinates:");
for(int i=0; i < c.coords.length; i++)
System.out.println(c.coords[i].x + " " +
c.coords[i].y + " " +
c.coords[i].z + " " +
c.coords[i].t);
System.out.println();
}
public static void main(String args[]) {
TwoD td[] = {
new TwoD(0, 0),
new TwoD(7, 9),
new TwoD(18, 4),
new TwoD(-1, -23)
};
Coords
System.out.println("Contents of tdlocs.");
showXY(tdlocs); // OK, is a TwoD
// showXYZ(tdlocs); // Error, not a ThreeD
// showAll(tdlocs); // Error, not a FourD
// Now, create some FourD objects.
FourD fd[] = {
new FourD(1, 2, 3, 4),
new FourD(6, 8, 14, 8),
new FourD(22, 9, 4, 9),
new FourD(3, -2, -23, 17)
};
Coords
System.out.println("Contents of fdlocs.");
// These are all OK.
showXY(fdlocs);
showXYZ(fdlocs);
showAll(fdlocs);
}
}
В общем случае, для тoгo, чтобы установить верхнюю границу шаблона, используйте
В общем случае, для тoгo, чтобы установить верхнюю границу шаблона, используйте
extends superclass>
здесь superclass это имя класса, который служит верхней границей. Класс, заданный в качестве верхней границы (т.е.
superclass), также находится в пределах допустимых типов.
Вы также можете указать нижнюю гpаницу шаблона, добавив выражение super к объявлению шаблона.
Вот eгo общая форма:
super subclass>
в этом случае допустимыми аргyментами могут быть только классы, которые являются суперклассами для subclass. Это исключающая конструкция, поскольку она не включает класса subclass.
Создание обобщенного метода
// Демонстрация простого обобщенного метода.
class GenMethDemo {
Создание обобщенного метода
// Демонстрация простого обобщенного метода.
class GenMethDemo {
// Определение, содержится ли объект в массиве.
static
for(int i=0; i < y.length; i++)
if(x.equals(y[i])) return true;
return false;
}
Создание обобщенного метода
// Demonstrate a simple generic method.
class GenMethDemo
Создание обобщенного метода
// Demonstrate a simple generic method.
class GenMethDemo
// Determine if an object is in an array.
static
for(int i=0; i < y.length; i++)
if(x.equals(y[i])) return true;
return false;
}
public static void main(String args[]) {
// Use isIn() on Integers.
Integer nums[] = { 1, 2, 3, 4, 5 };
if(isIn(2, nums))
System.out.println("2 is in nums");
if(!isIn(7, nums))
System.out.println("7 is not in nums");
System.out.println();
// Use isIn() on Strings.
String strs[] = { "one", "two", "three",
"four", "five" };
if(isIn("two", strs))
System.out.println("two is in strs");
if(!isIn("seven", strs))
System.out.println("seven is not in strs");
// Opps! Won't compile! Types must be compatible.
// if(isIn("two", nums))
// System.out.println("two is in strs");
}
}
синтаксис обобщенного метода: Результат работы этой проrpаммы показан ниже:
2 содержится в nums
7 не содержится в nums
два содержится в strs
семь не содержится в strs
Обобщенные конструкторы
Конструкторы также могут быть обобщенными, даже если их классы
Обобщенные конструкторы
Конструкторы также могут быть обобщенными, даже если их классы
// Use a generic constructor.
class GenCons {
private double val;
val = arg.doubleValue();
}
void showval() {
System.out.println("val: " + val);
}
}
class GenConsDemo {
public static void main(String args[]) {
GenCons test = new GenCons(100);
GenCons test2 = new GenCons(123.5F);
test.showval();
test2.showval();
}
}
Обобщенные интерфейсы
В дополнение к обобщенным классам и методам вы можете
Обобщенные интерфейсы
В дополнение к обобщенным классам и методам вы можете
// A generic interface example. class имякласса<список параметров типов>
// A Min/Max interface.
interface MinMax
T min();
T max();
}
// Now, implement MinMax
class MyClass
T[] vals;
MyClass(T[] o) { vals = o; }
// Return the minimum value in vals.
public T min() {
T v = vals[0];
for(int i=1; i < vals.length; i++)
if(vals[i].compareTo(v) < 0) v = vals[i];
return v;
}
// Return the maximum value in vals.
public T max() {
T v = vals[0];
for(int i=1; i < vals.length; i++)
if(vals[i].compareTo(v) > 0) v = vals[i];
return v;
}
}
class GenIFDemo {
public static void main(String args[]) {
Integer inums[] = {3, 6, 2, 8, 6 };
Character chs[] = {'b', 'r', 'p', 'w' };
MyClass
MyClass
System.out.println("Max value in inums: " + iob.max());
System.out.println("Min value in inums: " + iob.min());
System.out.println("Max value in chs: " + cob.max());
System.out.println("Min value in chs: " + cob.min());
}
}
implements имя интерфейса<список аргументовтипов>
Иерархии обобщенных классов
Обобщенные классы могут быть частью иерархии классов так же,
Иерархии обобщенных классов
Обобщенные классы могут быть частью иерархии классов так же,
Использование обобщенноrо суперкласса
// A simple generic class hierarchy.
class Gen
Использование обобщенноrо суперкласса
// A simple generic class hierarchy.
class Gen
T ob;
Gen(T o) {
ob = o;
}
// Return ob.
T getob() {
return ob;
}
}
// A subclass of Gen.
class Gen2
Gen2(T o) {
super(o);
}
}
class Gen {
T ob;
Gen(T o) {
ob
class Gen
T ob;
Gen(T o) {
ob
}
// Return ob.
T getob() {
return ob;
}
}
// A subclass of Gen.
class Gen2
Gen2(T o) {
super(o);
}
}
// Demonstrate run-time type ID implications of generic
// class hierarchy.
class HierDemo3 {
public static void main(String args[]) {
// Create a Gen object for Integers.
Gen
// Create a Gen2 object for Integers.
Gen2
// Create a Gen2 object for Strings.
Gen2
// See if iOb2 is some form of Gen2.
if(iOb2 instanceof Gen2>)
System.out.println("iOb2 is instance of Gen2");
// See if iOb2 is some form of Gen.
if(iOb2 instanceof Gen>)
System.out.println("iOb2 is instance of Gen");
System.out.println();
// See if strOb2 is a Gen2.
if(strOb2 instanceof Gen2>)
System.out.println("strOb is instance of Gen2");
// See if strOb2 is a Gen.
if(strOb2 instanceof Gen>)
System.out.println("strOb is instance of Gen");
System.out.println();
// See if iOb is an instance of Gen2, which it is not.
if(iOb instanceof Gen2>)
System.out.println("iOb is instance of Gen2");
// See if iOb is an instance of Gen, which it is.
if(iOb instanceof Gen>)
System.out.println("iOb is instance of Gen");
// The following can't be compiled because
// generic type info does not exist at run-time.
// if(iOb2 instanceof Gen2
// System.out.println("iOb2 is instance of Gen2
}
}
Обобщенный подкласс
Абсолютно приемлемо, когда суперклассом для обобщенногo класса выступает класс
Обобщенный подкласс
Абсолютно приемлемо, когда суперклассом для обобщенногo класса выступает класс
Нельзя создавать экземпляр типа пара метра
Создавать экземпляр типа параметра невозможно. Например, рассмотрим такой класс:
// Нельзя создавать экземпляр типа Т.
class Gen
T оb;
Gen () {
оb= new Т(); // Недопустимо!!!
}
Ограничения на статические члены
Никакой stаtiс член не может использовать тип
Ограничения на статические члены
Никакой stаtiс член не может использовать тип
class Wrong
// Неверно, нельзя создать статические переменные типа Т.
static Т оb;
// Неверно, ни один статический метод не может использовать Т.
static T getob() {
return оb;
}
// Неверно, ни один статический метод не может иметь доступ
// к объекту типа Т.
static void showob() {
System.out.println(ob);
Ограничения обобщенных массивов
// Обобщения и массивы.
class Gen
Ограничения обобщенных массивов
// Обобщения и массивы.
class Gen
т оb;
т vals[]; // ОК
Gen{T о, Т[] nums)
оb о;
// Этот оператор неверен.
// vals = new Т[10]; // нельзя создавать массив объектов Т
// Однако этот оператор верен.
vals = nums; // можно присвоить ссылку существующему массиву
}}
class GenArrays {
public static void main(String args[])
Integer n[] = { 1, 2, 3, 4, 5 );
Gen
// Нельзя создать массив специфичных для типа обобщенных ссылок.
// Gen
/ / Это верно.
Gen> gens[] = new Gen>[10]; // ОК
}
}