Hy vọng ai đó có thể giúp tôi thoát khỏi sự hỗn loạn này.Các generics Java truyền tham số
tôi đã thực hiện phương pháp này:
public static <T> void myMethod(Map<Class<T>, MyInterface<T>> map) {
}
Dùng paramter T để chắc chắn rằng các lớp học sử dụng như chìa khóa cũng giống như các lớp sử dụng như tham số trong MyInterface.
Bây giờ, tôi muốn chuyển một bản đồ mà các lớp khác nhau làm khóa, tất nhiên và triển khai tương ứng của MyInterface.
Nhưng nó không hoạt động, nhận được lỗi cú pháp do thông số loại. Đây là mã, tôi hy vọng là tự giải thích.
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<Class<?>, MyInterface<?>> map = new HashMap<Class<?>, MyInterface<?>>();
// Map<Class<Object>, MyInterface<Object>> map = new HashMap<Class<Object>, MyInterface<Object>>();
map.put(Object.class, new MyObjectImpl());
//if I use Map<Class<Object>, MyInterface<Object>> I get a compiler error here
//because map<String> is not map<Object> basically
map.put(String.class, new MyStringImpl());
//this would be possible using <?>, which is exactly what I don't want
// map.put(String.class, new MyIntegerImpl());
//<?> generates anyways a compiler error
myMethod(map);
}
//use T to make sure the class used as key is the same as the class of the parameter "object" in doSomething
public static <T> void myMethod(Map<Class<T>, MyInterface<T>> map) {
}
interface MyInterface<T> {
void doSomething(T object);
}
static class MyObjectImpl implements MyInterface<Object> {
@Override
public void doSomething(Object object) {
System.out.println("MyObjectImpl doSomething");
}
}
static class MyStringImpl implements MyInterface<String> {
@Override
public void doSomething(String object) {
System.out.println("MyStringImpl doSomething");
}
}
static class MyIntegerImpl implements MyInterface<Integer> {
@Override
public void doSomething(Integer object) {
System.out.println("MyIntegerImpl doSomething");
}
}
}
tên lớp kết thúc trong 'Impl' thường triệu chứng của quá kỹ thuật (ví dụ nó ngụ ý chỉ có một thi hành một giao diện cho , không thể được thi hành). – Romain
Hãy quên nó đi, điều này không thể làm việc được. Generics chỉ có thể xác định một bản đồ đồng nhất.Bạn không thể thực thi bất kỳ thứ gì trên cơ sở từng mục nhập, chỉ giống với tất cả các mục nhập bản đồ. –
@Romain tốt, tên thực tế không giống như vậy, chỉ cần viết nó để làm một ví dụ rõ ràng. Nhưng bình luận của bạn cũng có thể áp dụng. Ý bạn là nó ngụ ý chỉ thực hiện 1, tôi có 3 cái gì? – Ixx