【问题标题】:How to understand what type was selected instead of T in generic method?如何理解在泛型方法中选择了哪种类型而不是 T?
【发布时间】:2014-08-05 01:09:59
【问题描述】:

请研究以下代码 sn-p:

class Ideone {
    public static void main (String[] args) throws java.lang.Exception {
        List<Integer> listIntegers = null;
        List<Object> listObjects = null;
        MyClass mcls =new MyClass ();

        SomeReference ref = mcls.method(listIntegers,listObjects));//which SomeReference may be?
    }
}

class MyClass {
    <T> T  method(List<? extends T> arg1, List<? super T> arg2) {
        return null;
    }
}

除了null之外,我可以在名称为method的方法的返回语句中写什么;

对象? 数字? 整数?

【问题讨论】:

  • 您要返回什么?您的预期输出是什么?
  • @Braj 我很困惑我能返回什么。我想知道所有可能的变体
  • 如果不知道自己想做什么,那就先想想再问。即使你不知道这个方法在这里做了什么,那么你怎么能指望我们考虑它。 永远不要问任何你自己都不清楚的愚蠢问题。
  • 我想这样写:Reference ref =mcls.method(listIntegers,listObjects)
  • 看你传递了两个列表,只返回一个项目。但我不清楚你如何在方法中使用这些列表以及你想要返回什么。说得更清楚,拜托....

标签: java generics type-conversion wildcard type-inference


【解决方案1】:

它可能会帮助您理解它。由于您无法从第二个列表中返回任何项目,因此只有一个选项可以从第一个列表中返回项目。

class MyClass {
    <T> T method(List<? extends T> list1, List<? super T> list2) {
        return list1.get(0); // Valid
        //return list2.get(0); // Invalid Type mismatch: cannot convert from capture#1-of ? super T to T
    }
}

List<Integer> listIntegers = new ArrayList<Integer>();
listIntegers.add(1);

List<String> listObjects = new ArrayList<String>();
listObjects.add("2");

MyClass mcls = new MyClass();

// Valid
Integer result=mcls.method(listIntegers, listObjects);

// Invalid
String result=mcls.method(listIntegers, listObjects);
// The method method(List<? extends T>, List<? super T>) in the type MyClass is not applicable for the arguments (List<Integer>, List<String>)

【讨论】:

  • 这就是 T 最具体的类型吗?
  • 如果你认为你会在这个方法中传递两种不同类型的列表,那么使用双泛型参数&lt;T,V&gt;
  • 只是理论问题
猜你喜欢
  • 2021-06-28
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多