java的价值照
#java #generics

)是ª¥t¥t¥quªaacªaac resªQªQªQªSªS。几年。这是p和æåd±±±±±e±±±±±±±€¾Å了¾¾äxver¾

âÅæ©Å¶

è«ÅÅ项»¥ästR

class A {
    int id;
    public A(int id) {
        this.id = id;
    }
}

public class Test0 {
  public static void main(String[] args) {
    A a1 = new A(20);
    int i = a1.id;
    System.out.println(i);
  }
} 

ÅRæÅÅÅÅÅ奥奥ÅÅÅÅÅÅÅ奥奥ÅÅÅÅÅÅ ²假达函请勿届

class A {
    Object id;
    public A(Object id) {
        this.id = id;
    }
}

public class Test1 {
  public static void main(String[] args) {
    A a1 = new A(20);
    int i = (Integer)a1.id;
    System.out.println(i);
    A a2 = new A("hello");
    String s = (String)a2.id;
    System.out.println(s);
  }
} 

±¼x¾奥的对象是Å¥,Å»¥ät。 p>

飣。 ¶iç英语¶¶¶¶icic极

ÅÅť议

Å°Éæ±±±±±

class A<T> {
    T id;
    public A(T id) {
        this.id = id;
    }
}

public class Test2 {
  public static void main(String[] args) {
    A<Integer> a1 = new A<Integer>(20);
    int i = a1.id;
    System.out.println(i);
    A<String> a2 = new A<Integer>("hello");
    String s = a2.id;
    System.out.println(s);
  }
} 

c亳i³I±°¶±±±±±±±±和©©©©©©©©© ©�ºET Ū¢æ¥gu. 。 ˆ。 ɪɪ

ÅÅ¥æ面式(类型擦除)

ÅPartéä假,以±±±±〜 ¾ç¾çKKK£| - | - ÅÅCELOšl和½äjaæšulÅÅÅ和½Å和½ÅiS§ÅDEABED温度 - €±±±和½±ä»¶ ,étaÅÅIst

ÅK了¾实太c.

ä假<μ ÅErieriæjéJéâ¢�º¢�� /

婴儿

±±±。 ɶÅÅÅ®ÅÅÅOOC¾ - ÅÅOUREQUAILÅQUAT ų“¥æ”生函

javaÅH'açélyé±±±±±±±±Åɪ¥ÅäåÅ£»£08¥£»£»£»£»£»£»£»£»£»£»£»£»£»£»£»£»£»£»£»£ »жÅ¥Åæb,ä≥。 º型別抹除法 (type erasure)ã

ÅÅ¥æÅ°(类型推理)

Ådone。 Ul¥¥¥¥¥Çet

class A<T> {
    T id;
    public A(T id) {
        this.id = id;
    }
}

public class Test2 {
  public static void main(String[] args) {
    A<Integer> a1 = new A<>(20);
    int i = a1.id;
    System.out.println(i);
    A<String> a2 = new A<>("hello");
    String s = a2.id;
    System.out.println(s);
  }
} 
错误p> c c¢Åa _ _ _££££to the the the the the the hature al I at 2¥a At2¥a at2¥au2ºÅ了ingæÆÆÆÆ援τe就物函€〜±±|是Å的Å€upæ¥et¥ä清单 - »¶

v°¥¥³ 。 ž不加工類別的問題äιWIT

éç?®ÅÅ¥ç€ÅÅ¥çÅÅ项

ä½äÅ了。 。

class Parent {}
class Child extends Parent {}
class Grandson extends Child {}

class A<T extends Parent> {
  T item;
  public A(T item) {
    this.item = item;
  }

  public T getItem() {
    return item;
  }
}

public class Test3 {
  public static void main(String[] args) {
    A<Parent> a1 = new A<>(new Parent());
    A<Child> a2 = new A<>(new Child());
    A<Grandson> a3 = new A<>(new Grandson());

    Parent p = a1.getItem();
    Child c = a2.getItem();
    Grandson g = a3.getItem();
  }
}

是£€ÅÅÅ了tm tm tm tm tm tm tm @¥ and’å¾çμÅPH

class A {
   Parent item;

   public A(Parent var1) {
      this.item = var1;
   }

   public Parent getItem() {
      return this.item;
   }
}

ä½Å了»¥çÅÅæ -Å -�I -°°。 »¥ästROÅ°±实量

public class Test3 {
   public static void main(String[] var0) {
      A var1 = new A(new Parent());
      A var2 = new A(new Child());
      A var3 = new A(new Grandson());
      Parent var4 = var1.getItem();
      Child var5 = (Child)var2.getItem();
      Grandson var6 = (Grandson)var3.getItem();
   }
}

ÅéÅ了ÅÅÅOUBå$ Å¥äžç&瀲æ²æ¥Å了。 é¢,ä¾Å€ï¼

class Parent {}
class RunnableChild extends Parent implements Runnable, Cloneable{
  public void run() {}
  public int compareTo() {return 1;}
}

class A<T extends Parent & Runnable & Cloneable> {
  T item;
  public A(T item) {
    this.item = item;
  }

  public T getItem() {
    return item;
  }
}

public class Test4 {
  public static void main(String[] args) {
    A<RunnableChild> a2 = new A<>(new RunnableChild());

    RunnableChild r1 = a2.getItem();
    Runnable r2 = a2.getItem();
    Cloneable c = a2.getItem();
  }
}
class A {
   Parent item;

   public A(Parent var1) {
      this.item = var1;
   }

   public Parent getItem() {
      return this.item;
   }
}

·â·€£|é。

public class Test4 {
   public static void main(String[] var0) {
      A var1 = new A(new RunnableChild());
      RunnableChild var2 = (RunnableChild)var1.getItem();
      Runnable var3 = (Runnable)var1.getItem();
      Cloneable var4 = (Cloneable)var1.getItem();
   }
}

是Å®C.€Å了»¥Åª确实

class A<T extends Cloneable & Runnable> {
  T item;
  public A(T item) {
    this.item = item;
  }

  public T getItem() {
    item.run();
    return item;
  }
}

編žCaÉ€¥Å€¼

class A {
   Cloneable item;

   public A(Cloneable var1) {
      this.item = var1;
   }

   public Cloneable getItem() {
      ((Runnable)this.item).run();
      return this.item;
   }
}

¥³d'¥¥¥££¹它们¹ ÅÅÅÅ了。 ¥¥Å邮票¶-¶-¶-¶-¶ -¶Å½LE¶ €|ÅPeka和圆形的É»é»é工作

çir的±±±±±±to¼pO¼Å®V

ä?Å大坝·raw)é不ÅÅ

ÅÅÅÅÅ了ææp ¶¶¶¶¶ ¶..纽纽庆火火火学±±±±±±±±±±ureª ¯ ¯ ¯ ¯ ¯ æ ¯ ¯ ¯ ¯ ¯ ה³ ¯ ¯ הle £ £ ï¼

class A<T> {
    public T id;
    public A(T id) {
        this.id = id;
    }
}

public class Test7 {
  public static void main(String[] args) {
    A<Integer> a1 = new A<>(20);
    A a2 = a1;
    Integer i1 = a1.id;
    Integer i2 = a2.id;
  }
} 

是£a2£®£4££°¥¥¥¥æææææææææææ美购用户¥ÅæbICTICATICA ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±und±±±±±±±±±±±±±±±±±±±±±±±±±±±±±ย ÅÅÅÅÅÅÅ奥项¶¶½e½e½¶¶¶

# javac Test7.java
Test7.java:13: error: incompatible types: Object cannot be converted to Integer
    Integer i2 = a2.id;
                   ^
1 error

écountoudoud s和½e的ª所有所有>

æªÅ¢¢¢æ¥ica¥ic

äst 。

class A<T> {
  public T item;
  public void setItem(T item) {
    this.item = item;
  }
}

class B extends A<Integer> {
}

public class Test8 {
  public static void main(String[] args) {
    B b1 = new B();
    b1.setItem(20);
    A a1 = b1;
    a1.setItem("hello");
    System.out.println(b1.item);
  }
}

±¼a1æ的€Å·¥ça是Å¥,€¥,以ū ^ setItim()æ Å¥ÅÅ°¥¥¥¥€¥â€ÖTUMAT ®

# java Test8
hello

é -th·ami·omive·艾美奖,äj¶

# javac Test8.java
Note: Test8.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details. 
# javac -Xlint:unchecked Test8.java
Test8.java:16: warning: [unchecked] unchecked call to setItem(T) as a member of the raw type A
    a1.setItem("hello");
              ^
  where T is a type-variable:
    T extends Object declared in class A
1 warning

and | and€€ÅÅ奥«讯¥¾Å¾美和``â€ÆÆÆæ假。 ¾¾¾¾¾¾¾¾¾¾¾¾¾¾似¾¾¾¾¾¾€€€¥¥¥¥¥æ¥æ¥æ¥æ¥æ¥æææææ计æ计»

·¥

çädäÅÅÅÅçét®³... ü»ب

class A<T> {
  public T item;
  public void setItem(T item) {
    this.item = item;
  }
}

class B extends A<Integer> {
  public void setItem(Integer item) {
    super.setItem(item);
  }
}

public class Test9 {
  public static void main(String[] args) {
    B b1 = new B();
    b1.setItem(20);
    A a1 = b1;
    a1.setItem("hello");
    System.out.println(b1.item);
  }
}

Éż»€»Å以æÅÅ了,® €Å»Å¼¼Bemä¾Å了¼

# java Test9
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer 
(java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')  
        at B.setItem(Test9.java:8) 
        at Test9.main(Test9.java:19)                                  

ä½。 ¬,是繩实

e |。 Å¥ï¼

class B extends A {
   public void setItem(Integer var1) {
      super.setItem(var1);
   }

   // $FF: synthetic method
   // $FF: bridge method
   public void setItem(Object var1) {
      this.setItem((Integer)var1);
   }
}

äsçç簼ŷŠ-nteristeréengtitness()Åta䈺ÅÅÅÅÅÅÅÅ项。

€»¥æ碢¢¢â€â€âa �� e | a | |鶶ét Å|μ,Å°±实

çºäºè§£æ±›奥,Ç。 。 æ æ æ å ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ß ¯ ï ĺ é º çèe ¨èe æè³ ÄÃ, å at ³у ¨ ¸ ¸ tÅ æ ¸ ¸ ¸ ¸ å ally ä grakale on äå截至Qottéçsetitness(),ˆ | - | ±±±±±±us

é。 æ劫可(‶佶佶佶佶佶佶ä½了。

›€函数·¥e³æÅÅ¥¥

ż ,äÅ»←ästRep -

class A<T> {
  T id;
  public A(T id) {
    this.id = id;
  }

  public void show() {
    System.out.println(id * 3);
  }
}

c c c·â€ÅV¾ä»¥äst

# javac Test11.java
Test11.java:8: error: bad operand types for binary operator '*'
    System.out.println(id * 3);
                          ^
  first type:  T
  second type: int
  where T is a type-variable:
    T extends Object declared in class A
1 error

ÇC¾是μ标μ会μx ¥。 at。 âicalææ Ææææјura的,ÅLeçaél®Å项和½¯ªc¥tÅ'一种

Åäɪ€¢¥ªªª¢ÅÅÅÅÅÅ了ÖT id·我和æ和æand和æand和æand and u«ss john了约翰·Å楥¥¥¥¥¢¢³€砂,ar?砂,ar?、,, ark,、,,×砂,ar?砂,ar?、,, ark,、,,×敬用

ä½ -â颁奖了。 Šü≤LETOOVOÅVISALIAMPEN。 Åeasy ofæe haveed了,€ žÅÅÅÅÅÅÅÅ奥¾奥?¾已待定的ÅÅÅ奥奥¶¶¶ ¶â€¶....¶ÅÅÅÅOUB¥ay aw是�èu�u。

çor�做Š©³©ç©¶»¶

<免费付给ÅCÅÅÅOUK€Å»❤ 瓩件²ú出行

import java.util.*;

public class Test12 {
  public static double avg(List<Number> l) {
    double total = 0;
    for(Number n:l) {
      total += n.doubleValue();
    }  
    return total / l.size();
  }

  public static void main(String[] args) {
    ArrayList<Integer> l = new ArrayList<>();
    l.add(20);
    l.add(30);
    System.out.println(avg(l));
  }
}

Éç¶整数数字èªä¼

# javac Test12.java
Test12.java:16: error: incompatible types: ArrayList<Integer> cannot be converted to List<Number>
     System.out.println(avg(l));
                            ^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output   1 error

éª为ª€ 逢ÅV,€号码ç©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©迈©迈©©万迈万万万万万万万万万,2万万万万万,2万万·万万·万特) ©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©迈©迈射空空尝试,Å|Åm.arraylist Å»€ s。

楱±ÅÅÅÅÅÅAntantAnt⥥′¢Å¢ÅÅÅÅOVA»❤»❤»❤»❤»。

ÅÅ了不是天生

public class Test13 {
  public static double avg(List<? extends Number> l) {
    double total = 0;
    for(Number n:l) {
      total += n.doubleValue();
    }  
    return total / l.size();
  }

  public static void main(String[] args) {
    ArrayList<Integer> l = new ArrayList<>();
    l.add(20);
    l.add(30);
    System.out.println(avg(l));
  }
}

Ŷäˆ,? 。 >扩展数字Åçæç°® ÅGu €

# java Test13
25.0

vin了和Écra®必须做敬用完成‥Åpere³ÅÅÅÅiqueæç > ÅÅÅÅÅÅÅÅÅÅÅ项ÅAllåAllåäl(ˆ,ÄbT

import java.util.*;

public class Test14 {
  public static void add(List<? extends Number> l, int item) {
    l.add(item);
  }

  public static void main(String[] args) {
    ArrayList<Integer> l = new ArrayList<>();
    add(l, 20);
  }
}

Ééªäè -‼

# javac Test14.java
Test14.java:5: error: incompatible types: int cannot be converted to CAP#1
    l.add(item);
          ^
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Number from capture of ? extends Number
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error

你是¯<1 <1 <1 在Å°°°度上和ªÅ ж  »¢€€¢描述→ŻŻ°ç³VÅÅ了Å了Å了âic? älç⁇¥échistemole ole ole o eentegverçδ。 l ¯ üä üä l ¯ l ¯ä ¯« Ç «ç IJ Volå, e £ ì ± ± ± ± ì³ ¥ integers ¥ integers ¥ integers ¥ integers ¥ integers ¥ integers ¥ integriding ¥ trader ¥ integers ¥ integers ¥ integers ¥ integrate ¥整数¥整数¥francesų±←←©»¶»¶>>>>>

and -¬aÅe了âuÅouåÅÅÅÅÅÅÅÅ项©©©) ˆÅVO了

public HashSet(Collection<? extends E> c)
' éÅåç'çoud A

æiíiíIdi±ÁÅÅÅOB¥æ的的的»

eggè®至³超级

import java.util.*;

public class Test14 {
  public static void add(List<? super Integer> l, int item) {
    l.add(item);
  }

  public static void main(String[] args) {
    ArrayList<Integer> l = new ArrayList<>();
    add(l, 20);
  }
}

ésant'dÅicu o icu o o o o vick。 ç'ço²lå,and |Å©©©¢¢ - ©»¶²别除(¢u¢u¢u¢çºObject)对象Å¥¢¥¢¥&¥&¥€€€¾ád°±±±±±±±±±±! Æ®

äst 。

import java.util.*;

public class Test16 {
  public static double avg(List<? super Integer> l) {
    double total = 0;
    for(Integer n:l) {
      total += n;
    }  
    return total / l.size();
  }

  public static void main(String[] args) {
    ArrayList<Integer> l = new ArrayList<>();
    l.add(20);
    l.add(30);
    System.out.println(avg(l));
  }
}

Ééªäè -‼

# javac Test16.java
Test16.java:6: error: incompatible types: CAP#1 cannot be converted to Integer
    for(Integer n:l) {
                  ^
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object super: Integer from capture of ? super Integer
1 error

æaçforpaaffa的¢ºç¶º¶EngCent©t±±±±±±±±ÅègeægeægeititutIttiT。

以<?延伸>æš°°°°°°°°°°°°°°°°°°°°°°°°°°°°? super>æ了〜°°°°°°°°°°°°°°°°©ä»¶Å项ÅITH。 äçãoäção扩展了!!super是Ŷ¶Å,是£°°±·<?扩展对象>æ

çμ

ÅÅ了«ˆ,e。 â,Å完成½!Å。