여러 개의 자바 범용 예시 공유

5638 단어 java범용
1. 범용 클래스
1.1 일반

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);
    }
}
출력 결과:

java.lang.Integer
5
java.lang.Double
5.55
java.lang.String
hello world
1.2K/V 범용

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"));
    }
}

출력 결과:

jianing
24
2. 범용 인터페이스

package test.lujianing;
/**
 *
 * @param <T>
 */
public interface TestImpl<T> {
    public void setValue(T t);
    public T getValue();
}
출력 결과:

1
hello word
3. 범용 방법

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);
    }
}

출력 결과:

java.lang.Integer
30
java.lang.Double
40.0022
4. 범용 제한
위의 예에서class Test 형식 소유자 T의 범위를 제한하지 않았습니다. 기본적으로 형식을 제한하는 것은 Object에 해당합니다.예를 들어 우리는 T를 디지털 인터페이스 유형으로 제한해야 한다.이렇게 하기만 하면:class Test, 이런 종류의 범용 T는 Number 인터페이스의 실현 클래스일 뿐, 비Number 인터페이스로 전송되면 컴파일이 잘못될 수 있습니다.
5. 일반형

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());
        }
    }
}

출력 결과:

key:Double value:class java.lang.Double
key:Integer value:class java.lang.Integer
간단한 예: 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());
    }
출력 결과:

java.lang.Integer
5
java.lang.Double
5.55
6. 보충
범형에서는 등을 만날 수 있으며, T와 E는 각각 Type과 Element의 이니셜이다.E는 일반적으로 집합 형식 중의 요소의 유형을 나타낸다. 예를 들어 List 인터페이스의 정의,public interface List extends Collection 이다.이것은 단지 일종의 명명 습관일 뿐, 둘은 본질적인 차이가 없다.

좋은 웹페이지 즐겨찾기