Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在Java中形成带有两个问号的类型表达式_Java_Generics - Fatal编程技术网

无法在Java中形成带有两个问号的类型表达式

无法在Java中形成带有两个问号的类型表达式,java,generics,Java,Generics,我既不能编译也不能重构以下代码来工作: public class DoubleQuestionMark { public static class Paired1<P,R> { } public static class Paired2<P,R> { } public static class Paired3<P,R> { } // regard it as third party method, not al

我既不能编译也不能重构以下代码来工作:

public class DoubleQuestionMark {

   public static class Paired1<P,R> {
   }

   public static class Paired2<P,R> {
   }

   public static class Paired3<P,R> {
   }

   // regard it as third party method, not allowed to change signature
   public static <S> void perform(Paired1<Paired2<S,?>, Paired3<S,?>> argument) {
   }


   public static void main(String[] args) {

      Paired2<Integer, ?> p2 = new Paired2<>();
      Paired3<Double, ?> p3 = new Paired3<>();

      Paired1<Paired2<Integer, ?>, Paired3<Double, ?>> p1 = new Paired1<>();

      perform(p1); // cannot be applied to given class

   }
}
公共类双问号{
公共静态类Paired1{
}
公共静态类Paired2{
}
公共静态类Paired3{
}
//视为第三方方式,不允许更改签名
公共静态void perform(Paired1参数){
}
公共静态void main(字符串[]args){
Paired2 p2=新的Paired2();
Paired3 p3=新的Paired3();
Paired1 p1=新Paired1();
perform(p1);//不能应用于给定的类
}
}

如何准备一个对象,可由
执行
方法接受?

您正试图为同一类型参数
S
传递两种不同的类型

Paired1
两个
S
必须为同一类型:

因此,这将起作用:

Paired1<Paired2<Integer, ?>, Paired3<Integer, ?>> p1 = new Paired1<>();
perform(p1);
paired1p1=新的Paired1();
执行(p1);
但这不会:

Paired1<Paired2<Integer, ?>, Paired3<Double, ?>> p1 = new Paired1<>();
perform(p1);
paired1p1=新的Paired1();
执行(p1);
如果您需要传递两种不同的数字类型,整数和双扩展数字。因此,您可以使用:

Paired1<Paired2<Number, ?>, Paired3<Number, ?>> p1 = new Paired1<>();
paired1p1=新的Paired1();

您试图为同一类型参数
S
传递两种不同的类型

Paired1
两个
S
必须为同一类型:

因此,这将起作用:

Paired1<Paired2<Integer, ?>, Paired3<Integer, ?>> p1 = new Paired1<>();
perform(p1);
paired1p1=新的Paired1();
执行(p1);
但这不会:

Paired1<Paired2<Integer, ?>, Paired3<Double, ?>> p1 = new Paired1<>();
perform(p1);
paired1p1=新的Paired1();
执行(p1);
如果您需要传递两种不同的数字类型,整数和双扩展数字。因此,您可以使用:

Paired1<Paired2<Number, ?>, Paired3<Number, ?>> p1 = new Paired1<>();
paired1p1=新的Paired1();

注意,
参数的类型是:

Paired1<Paired2<S,?>, Paired3<S,?>>
Integer
Double
有一个公共的超类
Number
。当您将上面的行更改为以下内容时,它将起作用:

Paired1<Paired2<Number, ?>, Paired3<Number, ?>> p1 = new Paired1<>();

perform(p1); // ok
paired1p1=新的Paired1();
执行(p1);//好啊

注意,
参数的类型是:

Paired1<Paired2<S,?>, Paired3<S,?>>
Integer
Double
有一个公共的超类
Number
。当您将上面的行更改为以下内容时,它将起作用:

Paired1<Paired2<Number, ?>, Paired3<Number, ?>> p1 = new Paired1<>();

perform(p1); // ok
paired1p1=新的Paired1();
执行(p1);//好啊
查看我的新问题请:查看我的新问题请:查看我的新qstn请:查看我的新qstn请: