我正在尝试制作一个只能包含Numbers的通用List.当我尝试向其添加一个Integer时,它会出现以下错误.
List中的add(T)不能应用于Java.lang.Number
public class QueryHelper<T extends Number> {
private List<T> records;
public void query(QueryTypes queryType) {
records = new ArrayList();
records.add((Number)new Integer(90));
}
}
Run Code Online (Sandbox Code Playgroud)
是什么导致了这个问题?
我有一个类foo,一个源自bar的食物的类,我在foo中有一个方法需要另一个foo
boolean baz(foo c)
{
return (condition)?true:false;
}
Run Code Online (Sandbox Code Playgroud)
我想为baz编写一个重载,它接受一个Vector并在所有这些上调用baz - 类似于
boolean baz(Vector<foo> v)
{
for(int i=0;i<v.size();++i)
{
if baz(v.get(i))
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我想在矢量栏上使用调用此方法.我尝试按照我刚刚概述的方式编写这个,当我尝试在bar的向量上调用此方法时,我遇到编译器错误.
我错过了什么?
我有这些课程:
public class A <T>{
}
public interface I {
}
public class X implements I {
}
public class B extends A<X>{
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中如果我这样做我得到错误:
A<I> myobj = (A<I>) new B();
Run Code Online (Sandbox Code Playgroud)
肯定是:
A<X> myobj = (A<X>) new B();
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做是好的,并且效果很好:
A<I> myobj = null;
myobj = (A<I>) Class.forName("B").newInstance();
Run Code Online (Sandbox Code Playgroud)
在最后一种情况下,我访问B的所有方法,并且工作得很好.
我需要将myobj声明为A,因为我只保证泛型obj的接口而不是具体的类.
有谁知道为什么我的第一个案例不起作用?
我想实现第一个应该是最优雅的.
public List<Object> query(){
List<Object> listToReturn = new ArrayList<Object>();
List<String> listOfString = new ArrayList<String>();
List<List<String>> listOfListOfString = new ArrayList<List<String>>();
listOfListOfString.add(listOfString);
listToReturn.add(listOfListOfString);
return listToReturn;
}
Run Code Online (Sandbox Code Playgroud)
如果我写:而不是上面的方法:
public List<Object> query(){
List<Object> listToReturn = new ArrayList<Object>();
List<String> listOfString = new ArrayList<String>();
List<List<String>> listOfListOfString = new ArrayList<List<String>>();
listOfListOfString.add(listOfString);
return listOfListOfString;
}
Run Code Online (Sandbox Code Playgroud)
我收到编译时错误,Type mismatch: cannot convert from List<List<List<String>>> to List<Object>
我有一点困惑。
在这个答案中,我尝试创建一个静态实用程序方法,使其List成为Map:
public static <K, T> Map<K, T> toMapBy(List<T> list,
Function<? super T, ? extends K> mapper) {
return list.stream().collect(Collectors.toMap(mapper, Function.identity()));
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好.但是,我发现该方法不能在与list.stream().collect(...)表达式相同的上下文中使用.该方法不够灵活.
List<Student> students = Arrays.asList();
Map<Long, Student> studentsById1 = students.stream()
.collect(Collectors.toMap(Student::getId, Function.identity()));
Map<Long, Student> studentsById2 = toMapBy(students, Student::getId);
Map<Long, Person> peopleById1 = students.stream()
.collect(Collectors.toMap(Student::getId, Function.identity()));
Map<Long, Person> peopleById2 = toMapBy(students, Student::getId); // compile error!
Run Code Online (Sandbox Code Playgroud)
在这个例子中,Student是一个子类型,Person并有一个getId返回a 的方法Long.
最后一个语句失败incompatible types: inference variable T has …
SqlOutParameter out = new SqlOutParameter("out_refcursor",OracleTypes.CURSOR,new StudentRowMapper());
Run Code Online (Sandbox Code Playgroud)
//一些代码..
MapSqlParameterSource parameters = createMapSqlParameterSource();
parameters.addValue("in_studentid","101");
Map<String, Object> result = simpleJdbcCall.execute(parameters);
List<Student> students = (List<Student>) result.get("out_refcursor"); // here I get a warning
Run Code Online (Sandbox Code Playgroud)
execute()方法的定义:
Map<String, Object> org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SqlParameterSource parameterSource)
Run Code Online (Sandbox Code Playgroud)
"执行存储过程并返回输出参数的映射,按参数声明中的名称键入.."
以上警告: List<Student> students = (List<Student>) result.get("out_refcursor");
是"类型安全:未选中从对象转换为列表"
我知道这只是一个编译时警告,而且我可以做一个@SuppressWarnings("unchecked")来压制它.
问题:但我该如何正确施展呢?
我试过的一种方法是
List<Student> students = castObject( result.get("out_refcursor"));
@SuppressWarnings("unchecked")
private static <T extends List<?>> T castObject(Object obj){
return (T)obj;
}
Run Code Online (Sandbox Code Playgroud)我仍然需要放入@SuppressWarnings("unchecked")castObject()方法.我不知道这是否是正确的做法.
我尝试的第二种方式是,
List<?> students = castObject( result.get("out_refcursor"));
Student student = (Student)students.get(0);
private static …Run Code Online (Sandbox Code Playgroud)我创建了一个通用方法toList():
public static <T> List<T> toList(T... args){
List<T> list = new ArrayList<T>();
for (T t : args) {
list.add(t);
}
if(list instanceof Comparable<?>){
System.out.println("The list was considered a list of Comparable objects");
}
if(list instanceof Serializable){
System.out.println("The list was considered a list of Serializable objects");
}
if(list instanceof Object){
System.out.println("The list was considered a list of Object class' objects");
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
我称之为这样的方法:
public static void main(String[] args) {
System.out.println(Generics.<Comparable>toList(1,2,"3"));
}
Run Code Online (Sandbox Code Playgroud)
我期待,因为我提供了类型Comparable,第一个if条件将成立,o/p将是第一个Comparable,然后是Object.但令我惊讶的是,如果o/p是Serializable然后是Object,则控制权不会先进入.
任何人都可以对这背后的原因有所了解吗?另外,我不清楚在访问修饰符之后在方法签名中应用T的概念.
我们已经提到了访问说明符,修饰符和返回类型.供应T需要什么?
我在列表中使用通配符和下界泛型,但编译器抛出错误.
码:
int intStart = 0;
Number num = new Integer(2);
List<? super Integer> listOfNumbers = new ArrayList<>();
listOfNumbers.add(intStart);
listOfNumbers.add(num); //throws compiler error
Run Code Online (Sandbox Code Playgroud)
错误:
类型List中的方法add(capture#8-of?super Integer)不适用于参数(Number)
有了List<? super Integer>,我应该被允许添加任何类型的对象Integer或其超类型,例如数字或对象.我已经经历了一些SO讨论,但无法找到为什么我应该犯错误.
我知道我们无法在列表中添加扩展边界类型的元素。但我仍然不确定为什么java编译器不允许这样做。因为编译器可以很容易地检查添加的新元素是否是泛型类型的子类型。有人可以帮我解决这个问题吗?
我已经根据这个答案在JavaFX中创建了一个自定义表格单元格,因此我可以为单元格文本的不同部分设置不同的字体样式.
我在两种不同类型的TableView上使用这个自定义表格单元格:TableView<Track>和TableView<Album>.
两者Track并Album实现接口AlbumInfoSource:
public interface AlbumInfoSource {
public String getAlbumTitle();
public String getFullAlbumTitle();
public String getReleaseType();
public String getDiscSubtitle();
public Integer getDiscCount();
public Integer getDiscNumber();
}
Run Code Online (Sandbox Code Playgroud)
我的自定义TableCell使用该AlbumInfoSource键入,因此它可以为a TableView<Album>和a 渲染单元格TableView<Track>.
这是基本代码:
public class FormattedAlbumCell<T, S> extends TableCell <AlbumInfoSource, String> {
private TextFlow flow;
private Label albumName, albumType, albumDisc;
public FormattedAlbumCell () {
/* Do constructor stuff */
}
@Override
protected void updateItem ( String text, boolean …Run Code Online (Sandbox Code Playgroud)