类具有Type参数时,构造函数的类型推断会引发错误

时间:2019-12-05 10:53:37

标签: java generics

泛型概念的新手,下面的代码中我遇到了问题

public class Main
{
    static class GenericCheck<X>{
        private X x;
        <T> GenericCheck(T t){
            x=t;
            System.out.println(t);
        }
        public void display(){
            System.out.println(x);
        }
    }
    public static void main(String[] args) {
        GenericCheck<String> genericCheck = new GenericCheck("sathish worked");

    }
}

抛出错误:

Main.java:14: error: incompatible types: T cannot be converted to X
            x=t;

任何人都可以在这个问题上帮助我。预先感谢。

2 个答案:

答案 0 :(得分:1)

由于TX之间没有任何关系,因此编译器无法知道它们彼此之间的关系。

目前尚不清楚您要使用T做什么,X是否足够:

public class Main
{
    static class GenericCheck<X>{
        private X x;
        GenericCheck(X t){ // *** Use `X` directly
            x=t;
            System.out.println(t);
        }
        public void display(){
            System.out.println(x);
        }
    }
    public static void main(String[] args) {
        GenericCheck<String> genericCheck = new GenericCheck<>("sathish worked");
        // Need to provide generic here too ----------------^^  That shorthand form is fine

    }
}

但是如果您想使用T,则需要以某种方式将其与X相关联,例如:

public class Main
{
    static class GenericCheck<X>{
        private X x;
        <T extends X> GenericCheck(T t){
        //^^^^^^^^^^
            x=t;
            System.out.println(t);
        }
        public void display(){
            System.out.println(x);
        }
    }
    public static void main(String[] args) {
        GenericCheck<String> genericCheck = new GenericCheck<>("sathish worked");
        // -------------------------------------------------^^

    }
}

...但是除非您对T有其他约束,否则没有理由这样做,因为在构造过程中您已经可以使用上面第一个代码块中的类提供X的子类。可以正常工作,例如:

class Base {
}
class Derived extends Base {
}
public class Example
{
    static class GenericCheck<X>{
        private X x;
        GenericCheck(X t){
            x=t;
            System.out.println(t.getClass().getName());
        }
        public void display(){
            System.out.println(x);
        }
    }
    public static void main(String[] args) {
        GenericCheck<Base> genericCheck = new GenericCheck<>(new Derived());
    }
}

答案 1 :(得分:-3)

如果没有声明任何关系,JVM将无法执行x = t。 您可以通过

这样的显式转换来覆盖错误
x=(Object)T;