? 정의되지 않은 Java 유형을 나타냅니다.
T는 Java 유형을 나타냅니다.
K V는 각각 Java 키 값의 키 값을 나타냅니다.
E는 Element의 약자입니다.
이런 것들로 표현되는 Object와 Java 유형의 차이점은 무엇인가요?
Object는 모든 클래스의 루트 클래스이며 특정 클래스입니다. 사용 시 유형 캐스팅이 필요할 수 있지만 T? 이를 기다리면 실제 사용하기 전에 유형이 결정되므로 강제 변환이 필요하지 않습니다.
첫 번째 유형은 제네릭의 고정 유형이고 두 번째 유형은 Object 클래스의 하위 클래스이면 모든 클래스의 기본 클래스이기 때문에 어떤 클래스라도 사용할 수 있습니다. 고정 일반 유형은 고정입니다(예: Interge, String).
여기에서 컬렉션>을 확장합니까? 알 수 없는 유형을 나타냅니다.
그러나 이 알 수 없는 유형은 실제로 Collection의 하위 클래스이며 Collection은 이 와일드카드의 상한입니다.
예를 들어
class Test
Object를 사용하여 보편적으로 만드는 것이 좋습니다.
확장 컬렉션> 그 중 ?는 알 수 없는 유형이며 와일드카드 일반입니다. The method take(Animal) in the type Test is not applicable for the arguments (Demo<Dog>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Cat>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Animal>)
public class Demo <T extends Animal>{ private T ob; public T getOb() { return ob;
} public void setOb(T ob) { this.ob = ob;
} public Demo(T ob) { super(); this.ob = ob;
}
public void print(){
System.out.println("T的类型是:"+ob.getClass().getName());
}
}
public <T> Class<T> resolveAlias(String string) {
try {
if (string == null) {
return null;
}
// issue #748
String key = string.toLowerCase(Locale.ENGLISH);
Class<T> value;
if (TYPE_ALIASES.containsKey(key)) {
value = (Class<T>) TYPE_ALIASES.get(key);
} else {
value = (Class<T>) Resources.classForName(string);
}
return value;
} catch (ClassNotFoundException e) {
throw new TypeException("Could not resolve type alias '" + string + "'. Cause: " + e, e);
}
}
public class Base {
private static Map<String, Class<?>> map = new HashMap<>();
static {
map.put("string", String.class);
map.put("integer", Integer.class);
}
@SuppressWarnings("unchecked")
public <T> Class<T> get(String str) {
return (Class<T>) map.get(str);
}
@Test
public void t() throws IllegalAccessException, InstantiationException {
Base base = new Base();
Class<Integer> string = base.get("string");
System.out.println(string);
}
}
위 내용은 Java에서 class