【问题标题】:Incompatible types generics Java不兼容的类型泛型 Java
【发布时间】:2017-04-07 02:39:24
【问题描述】:

我做了这个代码:

import java.util.LinkedList;

public class Node<T> {
private T data;
private LinkedList<T> children;
public Node(T data) {
    this.data = data;
    this.children = new LinkedList<T>();
}
public T getData() {
    return this.data;
}
public LinkedList<T> getChildren(){
    return this.children;
}
}


public class Graph <T> implements Network<T> {
private Node source;
private Node target;
private ArrayList<Node> nodes = new ArrayList<Node>();


public Graph(T source,T target) {
    this.source = new Node(source);
    this.target = new Node(target);


}


public T source() {
    return source.getData();
}

public T target() {
    return target.getData();
}

我在 source() 和 target() 上得到这个错误: required T found java.lang.Object 为什么? getData() 函数的返回类型是 T(generic type of return)

【问题讨论】:

  • 编译器应该如何知道它们是相同的T?您必须这样明确声明:Node&lt;T&gt; source; Node&lt;T&gt; target;
  • @Obicere 谢谢它的工作原理!
  • @HKing Tom 更深入一点,但也得到了相同的观点。你应该接受它作为帮助其他人解决这个问题的答案。

标签: java generics


【解决方案1】:
private Node source;
private Node target;

这些应该是Node&lt;T&gt;。以下几行也是如此。编译器会给你一个警告。注意它。 (当你混合原始类型和泛型时,Java 语言规范通常要求编译器放弃。)

【讨论】:

    【解决方案2】:

    Graph 类中将 Node 替换为 Node&lt;T&gt;

    public class Graph<T> implements Network<T> {
        private Node<T> source;
        private Node<T> target;
        private ArrayList<Node> nodes = new ArrayList<Node>();
    
        public Graph(T source, T target) {
            this.source = new Node<T>(source);
            this.target = new Node<T>(target);
    
        }
    
        public T source() {
            return source.getData();
        }
    
        public T target() {
            return target.getData();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 2018-08-16
      • 2011-04-18
      • 2015-07-03
      相关资源
      最近更新 更多