gpt4 book ai didi

java - 如何从Java泛型类中提取类以满足编译器?

转载 作者:行者123 更新时间:2023-12-04 15:29:05 24 4
gpt4 key购买 nike

我完全知道这个问题被问了很多次,但我找不到答案。 :/

我有一个参数化类:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com