Genéricos Java “captura de?”

Eu estou trabalhando com uma TreeTable e ao mudar de fábrica de celular eu sou obrigado a passar um

 Callback<TreeTableColumn, TreeTableCell> 

onde A é uma class com a qual estou trabalhando, mas não tenho ideia de como trabalhar com a “captura de“?

Eu tentei criar

 new Callback<TreeTableColumn, TreeTableCell> 

mas IDEA mostra aviso

 setCellFactory(Callback<TreeTableColumn<A, capture>, TreeTableCell<A, capture>>) in TreeTableColumn cannot be applied to (anonymous Callback<TreeTableColumn, TreeTableCell>) 

Eu tentei usar classs específicas (como String) em vez de “?” também, mas nada ajudou.

Alguém poderia me explicar como trabalhar com isso?

Obrigado.

EDITAR:

Eu reuni um pouco mais de informação .. o CellFactory de TreeTableColumn deve ser Callback<TreeTableColumn TreeTableCell> , no entanto, o TreeTableColumn que eu estou trabalhando com é criado como um tipo bruto (em uma biblioteca).

Usando um tipo de retorno de chamada funciona. Mas existem outras opções para resolver isso?

Um curinga representa um tipo desconhecido.

captura de caractere curinga é o processo de vincular o valor de um tipo curinga a uma nova variável de tipo. Por exemplo:

 List list = ...; shuffle(list); 

Onde

  void shuffle(List list) { ... } 

Aqui, o valor desconhecido de ? está ligado à nova variável de tipo T na invocação do método shuffle , permitindo que o método shuffle se refira a esse tipo.

O compilador Java representa internamente o valor de um caractere curinga, capturando-o em uma variável do tipo anônimo, que ele chama de “captura de?” (na verdade, o javac os chama de “captura # 1 de?” porque diferentes usos de ? podem se referir a diferentes tipos e, portanto, ter diferentes capturas).

Ok, então o que está errado no seu código? Você está tentando invocar um método

  setCellFactory(Callback, TreeTableCell> factory); 

com

 Callback, TreeTableCell> factory; 

Na assinatura do método, o parâmetro de tipo T representa um único tipo, que deve ser fornecido pelo responsável pela chamada. Como conveniência, o compilador automaticamente tenta inferir um valor adequado (-> inferência de tipos). Seu erro de compilation significa que o compilador não pôde fazer isso.

Neste caso, isso não é uma falha da inferência de tipos, já que é realmente impossível atribuir um valor adequado a T , porque ambos ? precisa ser subtipos de T , mas o compilador não pode saber que os dois ? representam o mesmo tipo, ou até mesmo tipos relacionados.

Para invocar com sucesso este método, seu tipo de argumento deve usar o mesmo tipo para todas as ocorrências de T. Se você já tem esse tipo em mãos, vá em frente e use-o. Caso contrário, você poderá introduzir um usando a captura de curinga:

 setCellFactory(newFactory()); 

Onde

  Callback, TreeTableCell> newFactory() { return new Callback, TreeTableCell> { ... } } 

Pelo que eu encontrei do que é uma captura de captura e documentos genéricos de captura oracle parece que você está enfrentando algum problema onde o compilador não pode encontrar a class auxiliar necessária, ou tenta colocar object lá, mas o que você dá a ele não pode ser convertido com segurança.

EDITAR:

DEFAULT_CELL_FACTORY

public static final Callback,TreeTableCell>

Se nenhum cellFactory for especificado em uma instância TreeTableColumn, este será usado por padrão. No momento, ele simplesmente renderiza a propriedade de item TableCell dentro da propriedade graphic se o item for um Node, ou simplesmente chama toString () se não for nulo, configurando a string resultante dentro da propriedade text.

e

setCellFactory

public final void setCellFactory(Callback,TreeTableCell> value)

Define o valor da propriedade cellFactory. Descrição da propriedade: A fábrica de células para todas as células nesta coluna. A fábrica de células é responsável por renderizar os dados contidos em cada TreeTableCell para um único TreeTableColumn. Por padrão, TreeTableColumn usa uma fábrica de células padrão, mas isso pode ser substituído por uma implementação personalizada, por exemplo, para mostrar dados de uma maneira diferente ou para dar suporte à edição. Há muita documentação sobre a criação de fábricas de células personalizadas em outro lugar (veja Cell e TreeTableView, por exemplo).

Finalmente, há um número de fábricas de células pré-construídas disponíveis no pacote javafx.scene.control.cell.

retirado do Java 8 API Doc .

então algo assim deveria estar indo mais na direção certa:

 public static  Callback, TableCell> forTableColumn() { return forTableColumn(new DefaultStringConverter()); } 

ou algo assim dependendo do que você deseja dar no Cell.

 setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter())); 

esses trechos de código são retirados deste segmento StackOverflow

e por último este link pode ajudá-lo também: Tutorial de célula TableView

Então, isso deve lhe dar mais luz no escuro sobre o que pode estar causando o problema.