2010-04-19 2 views
36

형식 매개 변수를 사용할 수있는 메서드 (또는 메서드에서 형식을 알아낼 수있는 메서드)를 작성하고이 형식의 값을 반환하여 반환하지 않아도됩니다. 유형. 여기 Java 일반 반환 형식

은 방법 :
public Object doIt(Object param){ 
    if(param instanceof String){ 
     return "string"; 
    }else if(param instanceof Integer){ 
     return 1; 
    }else{ 
     return null; 
    } 
} 

나는이 메서드를 호출, 나는 반환 형식이 내가 반환 개체를 캐스팅해야하는 String 될 것입니다 알고있는 경우에도, 그 안에 문자열을 전달

. 이것은 int param과 유사합니다.

형식 매개 변수를 허용하고이 형식을 반환하려면 어떻게해야합니까? 이와

+2

중요한 질문은 항상 String과 int를 사용할지 여부입니다. 그렇다면 일반적인 방법이 필요하지 않습니다. int를 받아 들여 반환하는 메서드와 String을 받아 들여 반환하는 메서드가 필요합니다. –

답변

67

당신은이 방법으로 일반적인 방법을 사용할 수있는 물건을 처리하기 위해 특정 인터페이스를 갖고 싶어하지 않는 경우 :에 그

public <T> T mymethod(T type) 
{ 
    return type; 
} 

마음을 이런 식으로 컴파일러는 해당 메서드 내에서 사용할 계획에 대해 알지 못하므로 바인딩 된 형식을 사용해야합니다 (예 :

).
public <T extends YourType> T mymethod(T type) 
{ 
    // now you can use YourType methods 
    return type; 
} 

하지만 일반적인 방법이 필요하다는 것을 의미합니다. 즉, doIt의 구현은 사용하려는 모든 유형에서 동일하게 적용됩니다. 모든 구현은 단지 방법을 다른 과부하되어 그렇지 않은 경우 반환 형식은 동적 사용되지 않기 때문에,이 바인딩 잘 작동합니다 :

public String my(String s) 
{ 
    return s; 
} 

public int my(int s) 
{ 
    return s; 
} 

int i = my(23); 
String s = my("lol"); 
10

시작 :

public interface Command<T> 
{ 
    T execute(T parameter); 
} 
0

내가 instanceof를 하지 사용하는 방법을 촉구하지만이 코드는 무엇을합니까 원하는 :

public class Main 
{ 
    public static void main(String[] args) 
    { 
     final Main main; 
     final String strVal; 
     final Integer intVal; 
     final Float floatVal; 

     main  = new Main(); 
     strVal = main.doIt("Hello"); 
     intVal = main.doIt(5); 
     floatVal = main.doIt(5.0f); 

     System.out.println(strVal); 
     System.out.println(intVal); 
     System.out.println(floatVal); 
    } 

    public <T> T doIt(final T thing) 
    { 
     T t; 

     if(thing instanceof String) 
     { 
      t = (T)"String"; 
     } 
     else if (thing instanceof Integer) 
     { 
      t = (T)Integer.valueOf(1); 
     } 
     else 
     { 
      t = null; 
     } 

     return (t); 
    } 
} 
+0

귀하의 예제에서 반환 형식이 동적 바인딩에 사용되지 않기 때문에 일반 메서드 대신 오버로드를 사용할 수 있습니다. – Jack

+1

물론, 가능한 한 게시 된 코드에 가까운 대답을 제공하려고했습니다. 나는 내 대답에 게시 된 코드가 끔찍한 아이디어라고 생각한다. 원하는 것을하고 있음에도 불구하고 그것을 사용하지 않을 것이다 :-) – TofuBeer

8

짧은 대답은 아닙니다. instanceof이 참여하자마자 Generics는 일반적으로 잘못된 대답입니다. 오버로드 된 메서드를 대신 사용하십시오.

public String doIt(String param){ 
    return "string"; 
} 

public Integer doIt(Integer param){ 
    return 1; 
} 

public Object doIt(Object param){ 
    return null; 
} 
+2

6 년 후 ... 선언 된 유형이'Object' 인 경우 이것은 승리했다. 메서드 오버로딩은 변수의 선언 된 유형에 따라 컴파일 타임에 수행됩니다. – Powerlord

+0

즉'Object var = "Bacon";이있는 경우에도 'String'인데도 doIt (Object param)이 호출됩니다. – Powerlord