java t和t类型变量比较,java – 为什么“t instanceof T”不允许,其中T是类型参数,t是变量?...

Eclipse表示,由于泛型橡皮擦,Type Parameter不允许使用instanceof操作.

我同意在运行时,不会保留类型信息.但请考虑以下类的通用声明:

class SomeClass{

T t;

SomeClass(Object o){

System.out.println(o instanceof T); // Illegal

}

}

在运行时,不会出现T!但是如果我实例化这个类型为Integer的类,那么相应的对象将具有Integer类型的字段t.

那么,为什么我不能用T检查变量的类型,它可以在运行时被Integer替换.而我实际上会做类似“o instanceof Integer”的事情.

在哪些情况下,允许带有类型参数的instanceof会导致故障,从而禁止它?

如果在运行时需要T,则需要在运行时提供它.这通常通过传递Class< T>来完成. T必须是.

class SomeClass {

final T t;

public SomeClass(Class tClass,T t) {

if(!tClass.isAssignableFrom(t.getClass()) throw new IllegalArgumentException("Must be a " + tClass);

this.t = t;

}

private SomeClass(T t) {

this.t = t;

}

public static SomeClass of(Class tClass,T t) {

if(!tClass.isAssignableFrom(t.getClass()) throw new IllegalArgumentException("Must be a " + tClass);

return new SomeClass(t);

}

}

// doesn't compile

SomeClass intSomeClass = SomeClass.of(Integer.class,"one");

Class clazz = Integer.class;

// compiles with a warning and throws an IAE at runtime.

SomeClass intSomeClass = (SomeClass) SomeClass.of(clazz,"one");

// compiles and runs ok.

SomeClass intSomeClass = SomeClass.of(Integer.class,1);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java 中,可以使用可变参数列表实现不固定参数名和参数类型的接受和解析。 可变参数列表是指方法参数的数量是可变的,方法定义中使用“...”表示,例如: ```java public void printValues(String... values) { for (String value : values) { System.out.println(value); } } ``` 在上面的例子中,printValues() 方法接受一个或多个字符串作为参数,并遍历打印每个字符串。 调用可变参数列表方法时,可以传递任意数量的参数,例如: ```java printValues("Hello", "World"); // 输出 Hello World printValues("Java", "is", "cool"); // 输出 Java is cool ``` 在方法体内,可变参数列表被视为一个数组,因此可以使用数组的方式来处理参数。例如,可以使用 length 属性获取参数的数量: ```java public void printValues(String... values) { System.out.println("Number of values: " + values.length); for (String value : values) { System.out.println(value); } } ``` 在调用上面的方法时,输出结果为: ``` Number of values: 2 Hello World ``` 需要注意的是,可变参数列表必须是方法参数列表的最后一个参数。如果存在多个参数,可变参数列表之前的参数必须显式指定参数名称。例如: ```java public void printValues(int count, String... values) { System.out.println("Number of values: " + count); for (String value : values) { System.out.println(value); } } ``` 在调用上面的方法时,需要显式指定参数名称: ```java printValues(2, "Hello", "World"); // 输出 Number of values: 2\nHello\nWorld ``` ### 回答2: 在Java中,可以使用不固定参数名和参数类型的方式来接受和解析参数。 对于不固定的参数名,可以使用数组或列表来接受多个参数。例如,可以使用以下方法签名来接受不固定参数名的整数类型参数: ```java public void processIntegers(int... numbers) { for (int num : numbers) { // 对参数进行相应的处理操作 } } ``` 在调用该方法时,可以传入任意数量的整数参数: ```java int[] arr1 = {1, 2, 3}; processIntegers(arr1); processIntegers(4, 5, 6); ``` 对于不固定的参数类型,可以使用泛型来接受不同类型参数。例如,可以使用以下方法签名来接受不同类型参数: ```java public <T> void processObjects(T... objects) { for (T obj : objects) { // 对参数进行相应的处理操作 } } ``` 在调用该方法时,可以传入任意类型参数: ```java processObjects(1, "hello", true); ``` 在方法内部,可以根据参数的不同类型来进行适当的处理。例如,可以使用 instanceof 运算符来判断参数类型,并根据类型执行相应的操作: ```java public <T> void processObjects(T... objects) { for (T obj : objects) { if (obj instanceof Integer) { // 对整数类型参数进行处理 } else if (obj instanceof String) { // 对字符串类型参数进行处理 } else { // 对其他类型参数进行处理 } } } ``` 通过以上方式,可以灵活地接受和解析不固定参数名和参数类型,从而提高程序的灵活性和扩展性。 ### 回答3: 在Java中,没有固定参数名和参数类型的情况下,我们可以使用不定参数来接受和解析。 Java中的不定参数是通过在方法声明中使用"..."(三个连续的句点)来表示的。该参数可以接受任意数量的参数,即使在方法调用时没有显式地传递参数也是可以的。 不定参数在方法内部被当作数组来处理。这意味着我们可以像操作数组一样来使用这些参数,如访问数组的长度、遍历参数等。 我们可以使用一个示例来说明如何使用不定参数。假设我们有一个方法,需要接受任意数量的整数,并计算它们的和。代码如下所示: public static int calculateSum(int... numbers) { int sum = 0; for (int number : numbers) { sum += number; } return sum; } 在上述代码中,calculateSum方法接受一个不定参数numbers,它可以接受任意数量的整数。通过使用foreach循环遍历numbers数组,我们可以将每个整数加到sum变量上,最后返回计算得到的总和。 使用不定参数的方法调用示例如下: int sum1 = calculateSum(1, 2, 3); // 6 int sum2 = calculateSum(4, 5, 6, 7); // 22 int sum3 = calculateSum(); // 0 上述代码中,我们通过传递不同数量的整数来调用calculateSum方法,可以看到它们都能够正确地计算出对应的和。 总而言之,在Java中,我们可以使用不定参数来接受和解析不固定参数名和参数类型的情况。这为我们提供了更灵活的方法设计和调用方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值