相关疑难解决方法(0)

Java泛型自引用:它安全吗?

我有这个简单的界面:

public interface Node<E extends Node<E>>
{
    public E getParent();

    public List<E> getChildren();

    default List<E> listNodes()
    {
        List<E> result = new ArrayList<>();

        // ------> is this always safe? <-----
        @SuppressWarnings("unchecked")
        E root = (E) this;

        Queue<E> queue = new ArrayDeque<>();
        queue.add(root);

        while(!queue.isEmpty())
        {
            E node = queue.remove();

            result.add(node);

            queue.addAll(node.getChildren());
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到它this总是Node<E>(根据定义)的一个实例.
但是我无法想象一个this不是实例的情况E......
因为E extends Node<E>,不应该也不Node<E>等同于E定义?

你能给出一个实例的对象的例子Node<E>,但它不是一个实例E吗?

与此同时,我的大脑正在融化......


上一课是一个简化的例子. …

java generics this self-reference

16
推荐指数
1
解决办法
671
查看次数

在Java中转换为泛型类型不会引发ClassCastException?

我遇到了一个奇怪的Java行为,看起来像个bug.是吗?将对象转换为泛型类型(例如K),ClassCastException即使对象不是实例,也不会抛出K.这是一个例子:

import java.util.*;
public final class Test {
  private static<K,V> void addToMap(Map<K,V> map, Object ... vals) {
    for(int i = 0; i < vals.length; i += 2)
      map.put((K)vals[i], (V)vals[i+1]); //Never throws ClassCastException!
  }
  public static void main(String[] args) {
    Map<String,Integer> m = new HashMap<String,Integer>();
    addToMap(m, "hello", "world"); //No exception
    System.out.println(m.get("hello")); //Prints "world", which is NOT an Integer!!
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:感谢cletus和Andrzej Doyle提供的有用答案.因为我只能接受一个,所以我接受了Andrzej Doyle的回答,因为它让我找到了一个我认为不太糟糕的解决方案.我认为这是在单行中初始化小地图的一种更好的方法.

  /**
   * Creates a map with given …
Run Code Online (Sandbox Code Playgroud)

java generics casting

10
推荐指数
2
解决办法
3175
查看次数

Class <T>的Java泛型

所以我有一张地图:

Map<String, Class> format = new HashMap<String, Class>();
Run Code Online (Sandbox Code Playgroud)

我会像这样添加元素:

format.put("Vendor Number", Integer.class);
format.put("Vendor Dispatch", Date.class); 
....
Run Code Online (Sandbox Code Playgroud)

我有一个通用的方法如下:

public static <T> T verifyType(String name, Class<T> type) {
    if (type == Integer.class) {
        return type.cast(new Integer(Integer.parseInt(name)));
    }
             ......
    return null;
}
Run Code Online (Sandbox Code Playgroud)

现在这段代码很好用,没有编译器问题:

Integer i = verifyType("100",Integer.class);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这个:

    Integer i = verifyType("100",format.get("Vendor Number"));

OR 

    Class type = Integer.class
    Integer i = verifyType("100",type);
Run Code Online (Sandbox Code Playgroud)

编译器向我显示此警告:类型安全:未经检查的调用verifyType(String,Class)的泛型方法verifyType(String,Class)

这让我感到困惑......请帮忙...

java generics

8
推荐指数
1
解决办法
3万
查看次数

标签 统计

generics ×3

java ×3

casting ×1

self-reference ×1

this ×1