Heim  >  Artikel  >  Java  >  Teilen mehrerer generischer Java-Beispiele

Teilen mehrerer generischer Java-Beispiele

高洛峰
高洛峰Original
2017-01-18 11:00:051298Durchsuche

1. Generika-Klasse

1.1 Gewöhnliche Generika

package test.lujianing;
/**
 * 泛型类
 * @param <T>
 */
class Test<T>{
    private T obj;
    public void setValue(T obj){
        this.obj =obj;
    }
    public T getValue(){
        System.out.println(obj.getClass().getName());
        return obj;
    }
}
/**
 * 测试泛型类
 */
public class TestOne {
    public static void main(String[] args) {
        //测试Integer泛型
        Test<Integer> t1 = new Test<Integer>();
        t1.setValue(5);
        Integer i = t1.getValue();
        System.out.println(i);
        //测试Double泛型
        Test<Double> t2 = new Test<Double>();
        t2.setValue(5.55D);
        Double d = t2.getValue();
        System.out.println(d);
        //测试String泛型
        Test<String> t3 = new Test<String>();
        t3.setValue("hello world");
        String str =t3.getValue();
        System.out.println(str);
    }
}

Ausgabeergebnisse:

java.lang.Integer
5
java.lang.Double
5.55
java.lang.String
hello world

1.2 K/V-Generika

package test.lujianing;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by Administrator on 14-3-30.
 */
class TestKV<K,V>{
    private Map<K,V> map=new HashMap<K, V>();
    public void put(K k, V v) {
        map.put(k,v);
    }
    public V get(K k) {
        return map.get(k);
    }
}
public class TestFour{
    public static void main(String[] args) {
        TestKV<String,String> t = new TestKV<String, String>();
        t.put("name","jianing");
        System.out.println(t.get("name"));
        TestKV<String,Integer> t2 = new TestKV<String, Integer>();
        t2.put("age",24);
        System.out.println(t2.get("age"));
    }
}

Ausgabeergebnis:

jianing
24

2. Generische Schnittstelle

package test.lujianing;
/**
 * 泛型接口
 * @param <T>
 */
public interface TestImpl<T> {
    public void setValue(T t);
    public T getValue();
}

Ausgabeergebnis:

1
hello word

3. Generische Methode

package test.lujianing;
/**
 * 泛型方法类
 */
class TestMethod{
    /**
     * 泛型方法
     */
    public <T>T getValue(Object s,Class<T> clazz) {
        System.out.println(clazz.getName());
        T t =null;
        if(clazz.getName().equals("java.lang.Integer")){
            Double d = Double.parseDouble(s.toString());
            int i =d.intValue();
            t=(T)new Integer(i);
        }
        if(clazz.getName().equals("java.lang.Double")){
            t=(T)new Double(s.toString());
        }
        return t;
    }
}
/**
 * 泛型方法测试类
 */
public class TestThree {
    public static void main(String[] args) {
        TestMethod t = new TestMethod();
        int i =t.getValue("30.0011",Integer.class);
        System.out.println(i);
        double d  =t.getValue("40.0022",Double.class);
        System.out.println(d);
    }
}

Ausgabeergebnis:

java.lang.Integer
30
java.lang.Double
40.0022

4. Generika einschränken

Im obigen Beispiel gibt es keine Einschränkung für den Umfang des Klassentyps „Test8742468051c85b06f0a0af9e3e506b5c“. entspricht Objekt. Beispielsweise möchten wir T auf einen digitalen Schnittstellentyp beschränken. Gehen Sie einfach wie folgt vor: class Testb8acfc0f0bb79e5c69e52dfc9c9fe5d2. Auf diese Weise kann das generische T in der Klasse nur die Implementierungsklasse der Number-Schnittstelle sein. Wenn eine Nicht-Number-Schnittstelle übergeben wird, tritt ein Kompilierungsfehler auf.

5. Wildcard-Generika

package test.lujianing;
import java.util.HashMap;
import java.util.Map;
/**
 * 通配泛型
 */
public class TestFive {
    public static void main(String[] args) {
        Map<String,Class<? extends Number>> map = new HashMap<String,Class<? extends Number>>();
        map.put("Integer",Integer.class);
        map.put("Double",Double.class);

        for (Map.Entry<String,Class<? extends Number>> entry : map.entrySet()) {
            System.out.println("key:" + entry.getKey() + " value:" + entry.getValue());
        }
    }
}

Ausgabeergebnisse:

key:Double value:class java.lang.Double
key:Integer value:class java.lang.Integer

Einfaches Beispiel: Beispiel für 1.1

public static void main(String[] args) {
        //测试Integer泛型
        Test<Integer> t1 = new Test<Integer>();
        t1.setValue(5);
        fun(t1);
        //测试Double泛型
        Test<Double> t2 = new Test<Double>();
        t2.setValue(5.55D);
        fun(t2);
    }
    public static void fun(Test<?> t){
        System.out.println("通配泛型"+t.getValue());
    }

Ausgabeergebnis:

java.lang.Integer
通配泛型5
java.lang.Double
通配泛型5.55

6. Ergänzung

In Generika können Sie auf 8742468051c85b06f0a0af9e3e506b5c1a4db2c2c2313771e5742b6debf617a1 usw. stoßen. T und E sind die Überschriften von Typ bzw. Element. E wird im Allgemeinen verwendet, um den Typ von Elementen in einem Sammlungstyp darzustellen, z. B. die Definition der List-Schnittstelle. Die öffentliche Schnittstelle List1a4db2c2c2313771e5742b6debf617a1 erweitert die Sammlung1a4db2c2c2313771e5742b6debf617a1. Dies ist lediglich eine Namenskonvention, es gibt keinen wesentlichen Unterschied zwischen den beiden.

Weitere generische Java-Beispiele und verwandte Artikel finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn