자바 제네릭 T vs Object
다음 두 메소드 선언의 차이점이 무엇인지 궁금합니다.
public Object doSomething(Object obj) {....}
public <T> T doSomething(T t) {....}
한 가지로는 할 수 있고 할 수있는 것이 있습니까? 이 사이트의 다른 곳에서는이 질문을 찾을 수 없습니다.
맥락에서 분리-차이가 없습니다. 모두 t
와 obj
당신의 방법을 호출 할 수 있습니다 Object
.
그러나 컨텍스트-일반 클래스가있는 경우 :
MyClass<Foo> my = new MyClass<Foo>();
Foo foo = new Foo();
그때:
Foo newFoo = my.doSomething(foo);
객체와 동일한 코드
Foo newFoo = (Foo) my.doSomething(foo);
두 가지 장점 :
- 캐스팅 할 필요가 없습니다 (컴파일러는 이것을 숨 깁니다)
- 작동하는 컴파일 시간 안전. 는 IF
Object
버전을 사용하는 경우 확인 방법은 항상 반환되지 않습니다Foo
. 이 반환Bar
되면ClassCastException
런타임에을 갖게 됩니다.
여기서의 차이점은 첫 번째로 호출자가 Object 인스턴스 (모든 클래스)를 전달해야하고 다른 Object (모든 클래스, 반드시 동일한 유형일 필요는 없음)를 다시 가져 오도록 지정한다는 것입니다.
두 번째로, 반환 된 타입은 클래스가 정의 될 때 주어진 타입과 동일합니다.
Example ex = new Example<Integer>();
여기에서는 클래스 또는 메서드에 더 많은 제약 조건을 적용 할 수있는 T 유형을 지정합니다. 예를 들어 우리는을 인스턴스화 할 수 있습니다 LinkedList<Integer>
또는 LinkedList<Example>
우리는 우리가 다음 방법 중 하나를 호출 할 때, 우리는 정수 또는 예 인스턴스를 다시 얻을 것이다 것을 알고있다.
여기서 주요 목표는 호출 코드가 유형 캐스팅에 의존하지 않고 클래스가 작동 할 객체 유형을 지정할 수 있다는 것입니다.
Oracle의 Java Generics *를 참조하십시오 .
* 업데이트 된 링크.
차이점은 일반적인 방법으로 캐스팅 할 필요가 없으며 잘못하면 컴파일 오류가 발생한다는 것입니다.
public class App {
public static void main(String[] args) {
String s = process("vv");
String b = process(new Object()); // Compilation error
}
public static <T> T process(T val) {
return val;
}
}
객체를 사용하면 항상 캐스팅해야하며 잘못했을 때 오류가 발생하지 않습니다.
public class App {
public static void main(String[] args) {
String s = (String)process("vv");
String b = (String)process(new Object());
}
public static Object process(Object val) {
return val;
}
}
추가 클래스 캐스팅을 수행 할 필요가 없습니다. 첫 번째 경우 클래스 java.lang.Object의 객체를 항상 얻게되며,이 클래스는 클래스로 캐스트해야합니다. 두 번째 경우 T는 일반 서명에 정의 된 클래스로 대체되며 클래스 캐스팅은 필요하지 않습니다.
런타임에는 아무것도 없습니다. 그러나 컴파일 타임에 두 번째는 매개 변수의 유형과 반환 값의 유형이 유형 T가 해결하는 것과 일치하는지 또는 하위 유형인지 확인하기 위해 유형 검사를 수행합니다 (첫 번째 예는 유형 검사를 수행하지만 모든 객체는 Object의 하위 유형이므로 모든 유형이 허용됩니다).
T is a generic type. Meaning it can be substituted by any qualifying object at runtime. You may invoke such a method as follows:
String response = doSomething("hello world");
OR
MyObject response = doSomething(new MyObject());
OR
Integer response = doSomething(31);
As you can see, there is polymorphism here.
But if it is declared to return Object, you can't do this unless you type cast things.
in the first case it takes a parameter of any type e.g.string and return a type foo. In the second case it takes a parameter of type foo and returns an object of type foo.
참고URL : https://stackoverflow.com/questions/5207115/java-generics-t-vs-object
'IT story' 카테고리의 다른 글
소스에서 데비안 / 우분투 패키지를 빌드하는 방법? (0) | 2020.07.26 |
---|---|
Java Collections가 프리미티브 유형을 직접 저장할 수없는 이유는 무엇입니까? (0) | 2020.07.26 |
의사 요소가 'img'요소와 작동하지 않는 이유는 무엇입니까? (0) | 2020.07.26 |
반응 / 리 독스 및 다국어 (국제화) 앱-아키텍처 (0) | 2020.07.26 |
subscribe 결과는 사용되지 않습니다 (0) | 2020.07.26 |