作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我完全知道这个问题被问了很多次,但我找不到答案。 :/
我有一个参数化类:
public class MessageType<T> {
private final Class<T> clazz;
public MessageType(final Class<T> clazz) {
this.clazz = clazz;
}
public Class<T> getClazz() {
return clazz;
}
}
static final MessageType<String> TYPE_A = new MessageType<>(String.class);
static final MessageType<Double> TYPE_B = new MessageType<>(Double.class);
static final MessageType<List<String>> PROBLEM_TYPE = new MessageType(List.class);
MessageType
的未经检查的强制转换。至
MessageType<List<String>>
在最后一行。
static final MessageType<List<String>> PROBLEM_TYPE = new MessageType<>(List<String>.class);
List<String>.class
不能在运行时计算,因为你知道,类型删除。 :D
最佳答案
您可以避免不必要的强制转换!
见下文:
public static class MessageType<T> {
static MessageType<List<String>> STRINGS_LIST_TYPE1 = new MessageType<>(List.class);
static MessageType<List<String>> STRINGS_LIST_TYPE2 = new MessageType<>();
static MessageType<Double> DOUBLE_TYPE = new MessageType<>(Double.class);
static MessageType<String> STRING_TYPE = new MessageType<>(String.class);
List<T> messages = new ArrayList<>();
Class<T> clazz;
@SuppressWarnings({"rawtypes","unchecked"})
MessageType(Class<? extends T> clazz) { this.clazz = (Class) clazz; }
MessageType() { this.clazz = null; }
void addMessage(T message) { messages.add(message); }
T getMessage(int i) { return messages.get(i); }
Class<T> getClazz() { return this.clazz; }
public static void main(String[] args) {
// MessageType<List<String>> STRINGS_LIST_TYPE1 = new MessageType<>(List.class);
STRINGS_LIST_TYPE1.addMessage(new ArrayList<String>()); // no compile issues
STRINGS_LIST_TYPE1.addMessage(new ArrayList<Integer>()); // compile error "not applicable for the arguments (ArrayList<Integer>)"
List<String> message1 = STRINGS_LIST_TYPE1.getMessage(0); // no warnings!
Class<List<String>> clazz1 = STRINGS_LIST_TYPE1.getClazz(); // no warnings!
// MessageType<List<String>> STRINGS_LIST_TYPE2 = new MessageType<>()
STRINGS_LIST_TYPE2.addMessage(new ArrayList<String>()); // no compile issues
STRINGS_LIST_TYPE2.addMessage(new ArrayList<Integer>()); // compile error "not applicable for the arguments (ArrayList<Integer>)"
List<String> message2 = STRINGS_LIST_TYPE2.getMessage(0); // no warnings!
Class<List<String>> clazz2 = STRINGS_LIST_TYPE2.getClazz(); // no warnings! but returns null
}
}
关于java - 如何从Java泛型类中提取类以满足编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57894866/
我是一名优秀的程序员,十分优秀!