2013-07-18 4 views
2

Я был смущен с моим кодом, который включает в себя универсальный метод, который не принимает никаких параметров, так, что будет возвращение общего типа такого метода, например:Общий метод без параметров

static <T> example<T> getObj() { 
    return new example<T>() { 

     public T getObject() { 
      return null; 
     } 

    }; 
} 

и это называлось с помощью :

example<String> exm = getObj(); // it accepts anything String like in this case or Object and everything 

интерфейс example's Defination является:

public interface example<T> { 

    T getObject(); 
} 

Мой вопрос: example<String> exm принимает строку, объект и все такое. Итак, в какое время типичный тип возврата указан как String и как?

+0

этот вопрос может быть несколько похожа на http://stackoverflow.com/questions/9827938/how-does-collections-reverseorder-know- what-type-parameter-to-use-while-returnin, но это не отвечает на мои конкретные вопросы: –

ответ

8

Компилятор описывает тип T от конкретного типа, используемого на LHS задания.

От this link:

Если параметр типа не появляется в типах метода аргументов, то компилятор не может вывести аргументы типа от изучения типов фактических аргументов методы. Если в возвращаемом типе метода появляется параметр типа , тогда компилятор принимает взгляд на контекст, в котором используется возвращаемое значение. Если вызов метода отображается как правый операнд задания, , тогда компилятор пытается вывести аргументы типа метода из статического типа левого и бокового операндов присваивания.

Пример кода в ссылке похож на тот, в вашем вопросе:

public final class Utilities { 
    ... 
    public static <T> HashSet<T> create(int size) { 
    return new HashSet<T>(size); 
    } 
} 
public final class Test 
    public static void main(String[] args) { 
    HashSet<Integer> hi = Utilities.create(10); // T is inferred from LHS to be `Integer` 
    } 
} 
+0

Thats вид вещей, которые я искал, я ожидал этого, но я не был уверен. спасибо мужчина –

+0

@SachinVerma. Добро пожаловать :) –

+0

Вы только что спасли мои 3 4 часа беспорядка. LoL –

0

Имея такую ​​общую статическую декларацию можно, как вы можете сделать:

example<String> x = getObj(); 
String s = x.getObject();//no casting required, good! 

НО getObject метод становится неопределенным, как вы бы получили return тип:

public T getObject() { 
//how would this method return based on T? 
//one way to always cast to T say: 
    //return (T) obj; 
    // but do you figure out obj based on T, NOT possible! due to type eraser at runtime 
    // a custom logic can produce diff type obj, but that's force casting and no generic usage 

       return null; 
      } 

Это лучше предоставить T информацию в качестве аргумента с помощью Class аргумента:

public <T> T getObject(Class<T> clazz) { 
//clazz can be used to derive return value 
.. 
} 
+0

согласился! хорошее предложение. ти –

Смежные вопросы