小编Jor*_*Joh的帖子

如何获取方法中传递的集合的元素类型?

假设我有一些方法接受List<?>

public void method(List<?> list) {
    // some logic
}
Run Code Online (Sandbox Code Playgroud)

如何在运行时获取元素类型?是否可以?

我发现了这些建议(在这里):

  1. ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0](不起作用,List是一个接口并且没有超类)
// ChatGPT's work

public class App {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        List<Integer> integerList = new ArrayList<>();

        Type stringType = getListElementType(stringList);
        Type integerType = getListElementType(integerList);

        System.out.println("String List Element Type: " + stringType.getTypeName());
        System.out.println("Integer List Element Type: " + integerType.getTypeName());
    }

    private static Type getListElementType(List<?> list) {
        Type genericType = list.getClass().getGenericSuperclass();

        if (genericType instanceof ParameterizedType) {
            ParameterizedType …
Run Code Online (Sandbox Code Playgroud)

java generics reflection

2
推荐指数
1
解决办法
108
查看次数

真的有必要将 lock.unlock() 放在 finally 块中吗?

真的有必要lock.unlock()在一个finally街区吗?下面是一个常见的习语

try {
    lock.lock();
    // some code
} catch (Exception e) {
    // exception handling
} finally {
    lock.unlock();
}
Run Code Online (Sandbox Code Playgroud)

然而,Java 语言规范是这样说的:

如果主体的执行曾经完成,无论是正常还是突然 [大概,例如由于异常]都会在同一监视器上自动执行解锁操作。

那么真的有必要加lock.unlock()块吗?finally或者我误解了规范?

java multithreading thread-synchronization

0
推荐指数
1
解决办法
228
查看次数