泛型概念的新手,下面的代码中我遇到了问题
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;
任何人都可以在这个问题上帮助我。预先感谢。
答案 0 :(得分:1)
由于T
与X
之间没有任何关系,因此编译器无法知道它们彼此之间的关系。
目前尚不清楚您要使用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;